- ベストアンサー
SQL-Serverにおけるサブクエリの使用制限とは?
- SQL-Serverにおいて、一部の条件下ではサブクエリを使用することができない場合があります。
- 具体的には、VB5.0(Win98)でSQL Server7(WinNT)を使用している場合、モジュール内でDAOを使用してODBCデータソースに接続してSQLを実行する際に、サブクエリを含むSQLを実行するとエラーが発生します。
- データコントロールではサブクエリを使用してSQL Serverから結果を取得できるのに、モジュール内でSQLを記述してサブクエリを含むSQLを実行するとエラーが発生するため、サブクエリをどこかで定義する必要がある可能性があります。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
予測ですが、レコードセットのオプションで dbSQLPassThroughを指定しないと DAOが勝手にSQL文を翻訳してしまうのが原因でないでしょうか? 下記ソースはエクセルで書きました。 (DAO3.6) Dim objConnDB As DAO.Database Dim objRec As DAO.Recordset Dim objWork As DAO.Workspace Private Sub Workbook_Open() Dim strSql As String Dim strBuf As String On Error GoTo FncErr Set objWork = DBEngine.Workspaces(0) Set objConnDB = objWork.OpenDatabase("", False, False, _ "ODBC;Driver={SQL Server};" & _ "SERVER=(local);DATABASE=TEST_DB;" & _ "UID=sa;PWD=;") strSql = "" strSql = strSql & " SELECT K_SEID, K_HOKENKB, " strSql = strSql & " SUM(KINGAKU) AS SumKINGAKU" strSql = strSql & " FROM (" strSql = strSql & " SELECT KONYU.K_SEID, KONYU.K_HOKENKB, " strSql = strSql & " ISNULL(KONYU.K_SURYO, 0) * ISNULL(BOOK.B_KAKAKU, 0) AS KINGAKU" strSql = strSql & " FROM KONYU, BOOK" strSql = strSql & " WHERE KONYU.K_TAISYO = 1 " strSql = strSql & " AND KONYU.K_MSGID = BOOK.B_MSGID " strSql = strSql & " AND KONYU.K_LINE = BOOK.B_LINE" strSql = strSql & " ) new" strSql = strSql & " GROUP BY K_SEID, K_HOKENKB" '引数が重要です→dbSQLPassThrough Set objRec = objConnDB.OpenRecordset(strSql, _ dbOpenDynaset, dbSQLPassThrough) If objRec.BOF = False And objRec.EOF = False Then Do Until objRec.EOF strBuf = "" strBuf = strBuf & Trim$(objRec.Fields("K_SEID") & "") & "," strBuf = strBuf & Trim$(objRec.Fields("K_HOKENKB") & "") & "," strBuf = strBuf & CCur(objRec.Fields("SumKINGAKU")) Debug.Print strBuf objRec.MoveNext Loop Else Call MsgBox("該当データ無し", vbOKOnly + vbCritical) End If Exit Sub FncErr: Call MsgBox(Err.Description, vbOKOnly + vbCritical) End Sub
補足
レコードセットのオプションにdbSQLPassThroughを指定することで サブクエリを使用したSQLを実行することが出来ました! ありがとうございました。 しかし、新たな問題が・・・ その取得したレコードセット(rs)の内容を、別のレコードセット(rs2)をオープンして 更新したいのですが、 問題なく処理できていたはずの、更新したいレコードセット(rs2)がオープンできなくなってしまいました。 これも引数の設定に問題があるのでしょうか? SQLText = "select new.K_SEID,new.K_HOKENKB,SUM(new.KINGAKU) as GOKEI " & _ " from ( select K_SEID,K_HOKENKB,K_SURYO * B_KAKAKU as KINGAKU " & _ " from KONYU,BOOK " & _ " where K_TAISYO = 1 and K_MSGID = B_MSGID and K_LINE = B_LINE ) as new " & _ " group by new.K_SEID,new.K_HOKENKB " Set rs = db.OpenRecordset(SQLText, dbOpenDynaset, dbSQLPassThrough) '更新対象DBオープン Set rs2 = db.OpenRecordset("select * from NOTU", dbOpenDynaset, dbSeeChanges) Do Until rs.EOF 'NOTUにレコードを追加 With rs2 .AddNew .Fields("NT_NENDO") = wk_NENDO .Fields("NT_SYUBETU") = Pub_Syubetu .Fields("NT_RENBAN") = wk_SeikyuNO .Fields("NT_SEID") = rs("K_SEID") .Fields("NT_HOKENKB") = rs("K_HOKENKB") .Fields("NT_KINGAKU") = rs("GOUKEI") .Fields("NT_OUT_DATE") = Date .Fields("NT_JYOTAI") = 0 .Fields("NT_NEW_NENDO") = wk_NENDO .Fields("NT_NEW_SYUBETU") = Pub_Syubetu .Fields("NT_NEW_RENBAN") = wk_SeikyuNO .Update End With rs.MoveNext Loop rs.Close rs2.Close