DOBON.NET DOBON.NETプログラミング掲示板過去ログ

Accessのリレーション

分類:[.NET]

以下のような場合のリレーションがVB.netで作成できないので、
なにかアイデアがあったらお願いします。

「list」と「userlist」という2つのテーブルがあります。
   リスト   ユーザーリスト
  「list」   「userlist」
  tantou    userID
  date     userName
  aite

というテーブルにおいて、tantouとaiteはそれぞれユーザーリストに情報が入っています。
[list]のtantouと[userlist]のuserIDとリレーションさせて、[userlist]のuserNameに、
[list]のaiteも[userlist]のuserIDとリレーションさせて、[userlist]のuserNameという形で置き換え、
置き換えた形でDataGridに表示を行う。

データクエリを用いて、[userlist]のuserIDに2つのリレーションを引いた場合はSQL上でAND処理されて、それぞれの表示ができなく、
[userlist]のテーブルを2つにしてそれぞれリレーションさせてみたりした場合は、演算子がありませんといったエラーがでました。

DBはAccess2000を使用しています。
SQL文的なことであるかもしれませんが、お願いします。
下記のSQL文でどうでしょうか

SELECT userlist.userName AS tantou, list.date, userlist_1.userName AS aite
FROM (list LEFT JOIN userlist ON list.tantou = userlist.userID) LEFT JOIN userlist AS userlist_1 ON list.aite = userlist_1.userID;

アクセスのクエリービューで作成する場合は、デザインビュー内に
[list]がひとつ、[userlist]が2つ存在する形になりますが、後で
追加した[userlist]は[userlist_1]として使用できます。
■No898に返信(fukuさんの記事)
> 下記のSQL文でどうでしょうか
>
> SELECT userlist.userName AS tantou, list.date, userlist_1.userName AS aite
> FROM (list LEFT JOIN userlist ON list.tantou = userlist.userID) LEFT JOIN userlist AS userlist_1 ON list.aite = userlist_1.userID;
>
> アクセスのクエリービューで作成する場合は、デザインビュー内に
> [list]がひとつ、[userlist]が2つ存在する形になりますが、後で
> 追加した[userlist]は[userlist_1]として使用できます。
>

回答の方ありがとうございます。
回答のようにして、処理を行ってみましたが、
以下のようなエラーがでてしまいました。

ADOエラー:クエリ式'list.tantou = userlist.userID LEFT OUTER JOIN userlist AS userlist_1 ON list.aite = userlist_1.userID'の構文エラー:演算子がありません。

と出てしまい、処理の方はうまくいきませんでした。
教えていただいたSQL文本体の方は何度も確認していますのでつづりといったミスはありません…
>>SELECT userlist.userName AS tantou, list.date, userlist_1.userName AS aite
>>FROM (list LEFT JOIN userlist ON list.tantou = userlist.userID) LEFT JOIN userlist AS userlist_1 ON list.aite = userlist_1.userID;

fukuさんがレスされているSQL文にOUTER JOINはありませんが、

> ADOエラー:クエリ式'list.tantou = userlist.userID LEFT OUTER JOIN userlist AS userlist_1 ON list.aite = userlist_1.userID'の構文エラー:演算子がありません。
>
> と出てしまい、処理の方はうまくいきませんでした。
> 教えていただいたSQL文本体の方は何度も確認していますのでつづりといったミスはありません…

こちらのエラーにはOUTERとありますが??
■No900に返信(よねKENさんの記事)
> >>SELECT userlist.userName AS tantou, list.date, userlist_1.userName AS aite
> >>FROM (list LEFT JOIN userlist ON list.tantou = userlist.userID) LEFT JOIN userlist AS userlist_1 ON list.aite = userlist_1.userID;
>
> fukuさんがレスされているSQL文にOUTER JOINはありませんが、
>
>>ADOエラー:クエリ式'list.tantou = userlist.userID LEFT OUTER JOIN userlist AS userlist_1 ON list.aite = userlist_1.userID'の構文エラー:演算子がありません。
>>
>>と出てしまい、処理の方はうまくいきませんでした。
>>教えていただいたSQL文本体の方は何度も確認していますのでつづりといったミスはありません…
>
> こちらのエラーにはOUTERとありますが??
>

レスありがとうございます。
fukuさんがかかれているとおりにしたのですが、上記のエラーがでてしまい、
勝手に変更されてしまいます。VB.netの仕様だと思いますが。
こんにちは。 tinaです。
ふと思ったのですが、
list や、date がADO.netの予約語とかぶっているとか?
いかがでしょう。
■No902に返信(tinaさんの記事)
> こんにちは。 tinaです。
> ふと思ったのですが、
> list や、date がADO.netの予約語とかぶっているとか?
> いかがでしょう。
>
>
レスありがとうございます。
上記の例はあくまで、例であって、実際の名前とは異なるんで…

上記の例のOleDBDataAdapterも作成してみて、SQLをうち、クエリビルダ上で実行を行ってみましたが、うまくいきませんでした。。。
fukuです。自分の環境では正常に動作しました。
ちなみにVisual Studio2003です。
あと、MSのDB接続コントロールは、VB6.0のADODCでやっつけられたので
接続系のコントロールは使っていません。
(どうもソースの貼り付け方がわからないので都合の良いところで
改行、TABあわせしてください)

 
   Private m_MyDataSet As DataSet

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim myOleDbConnection As OleDb.OleDbConnection
        Dim myOleDbCommand As New OleDb.OleDbCommand
        Dim myOleDbDataAdapter As OleDb.OleDbDataAdapter
        Dim intRecCnt As Integer = 0
        Dim strCnnString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\TEST\USER.mdb;Persist Security Info=False"
        Dim strSQL As String
        Try
            'データ読み込み
            myOleDbConnection = New OleDb.OleDbConnection(strCnnString)
            myOleDbConnection.Open()
            strSQL = "SELECT userlist.userName AS tantou, list.date, userlist_1.userName AS aite "
            strSQL = strSQL & "FROM (list LEFT JOIN userlist ON list.tantou = userlist.userID) "
            strSQL = strSQL & "LEFT JOIN userlist AS userlist_1 ON list.aite = userlist_1.userID;"
            myOleDbCommand.CommandText = strSQL
            myOleDbCommand.CommandType = CommandType.Text
            myOleDbCommand.Connection = myOleDbConnection
            myOleDbDataAdapter = New OleDb.OleDbDataAdapter(myOleDbCommand)

            'DataGridへ設定
            m_MyDataSet = New DataSet
            intRecCnt = myOleDbDataAdapter.Fill(m_MyDataSet, "Q_ユーザー情報")
            Me.DataGrid1.DataSource = m_MyDataSet
            Me.DataGrid1.DataMember = "Q_ユーザー情報"
            Me.DataGrid1.Refresh()

        Catch ex As Exception
            MsgBox(ex.Message, MsgBoxStyle.Exclamation)
        Finally
            If IsNothing(myOleDbDataAdapter) = False Then
                myOleDbDataAdapter.Dispose()
                myOleDbDataAdapter = Nothing
            End If
            If IsNothing(myOleDbCommand) = False Then
                myOleDbCommand.Dispose()
                myOleDbCommand = Nothing
            End If
            If IsNothing(myOleDbConnection) = False Then
                If myOleDbConnection.State <> ConnectionState.Closed Then
                    myOleDbConnection.Close()
                End If
                myOleDbConnection.Dispose()
                myOleDbConnection = Nothing
            End If

        End Try

    End Sub
fukuさん、ありがとうございました。
fukuさんが公開してくれたソースを見ていくうちに
最後に「;」がついてないことがわかり、
クエリビルダに";"をつけたら、うまくいきました。
2つ以上のテーブル使った場合はビルダで「;」つけてくれなく、
勝手に.netが作ったものを.net自身でエラーにしていたみたいでした。

レスくれたかたありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板