3

サブクエリを含むWebサービスで使用されるクエリを取得しました。SQL Server Management Studioでクエリを実行すると、正常に機能します。ただし、これをWebサービスでとして使用するとSqlCommand、次のようになります。

System.Data.SqlClient.SqlException:キーワード「JOIN」の近くの構文が正しくありません。キーワード「AS」の近くの構文が正しくありません。

余分な文字を挿入すると、エラーがサブクエリの直後の位置を参照していることがわかります。

クエリは次のとおりです。

SELECT H.H_ID AS ID, H.Name, TD.TDValue, A.A_ID, A_C.Value
FROM 
    H CROSS JOIN 
        A JOIN
            (SELECT TD.A_ID, TD.H_ID, MAX(cast(TD.Version AS bigint)) AS Version FROM TD GROUP BY TD.A_ID, TD.H_ID) AS TData ON TData.H_ID = H.H_ID AND TData.A_ID = A.A_ID LEFT JOIN
                TD2 ON TD2.H_ID = H.H_ID AND TD2.A_ID = A.A_ID AND TD2.Version = TData.Version LEFT JOIN 
                    A_C ON A_C.A_ID = A.A_ID AND cast(A_C.R AS CHAR) = cast(TD.TDValue AS CHAR)
WHERE   (H.Info = 1);

サブクエリは、テーブルTDのエントリの最後のバージョンを取得するために必要です。それを行うためのより良い方法があれば、私にも知らせてください。:-)

MS SQLには存在しないC#のSqlCommandに制限はありますか、それとも何か間違ったことをしていますか?

助けていただければ幸いです。

4

1 に答える 1

0

この場合、共通のテーブル式を使用する方が効率的だと思います。データベースの構造とデータのニーズがわからないため、これがまさにあなたが必要としているものであるとは 100% ではありませんが、これは役立つはずです。

;with
cte_Tdata AS
(
    SELECT 
         TD.A_ID
        ,TD.H_ID
        ,MAX(cast(TD.Version AS bigint)) AS Version 
    FROM 
        TD 
    GROUP BY 
         TD.A_ID
        ,TD.H_ID
),cte_TD AS
(
    SELECT
        TD.A_ID
        ,TD.H_ID
        ,TD.TDValue
    FROM
        TD
)
SELECT H.H_ID AS ID, H.Name, cte_TD.TDValue, A.A_ID, A_C.Value
FROM 
    H CROSS JOIN 
        A JOIN cte_Tdata ON cte_Tdata.H_ID = H.H_ID 
                    AND cte_Tdata.A_ID = A.A_ID 
            INNER JOIN cte_TD ON cte_Tdata.H_ID = cte_TD.H_ID 
                             AND cte_Tdata.A_ID = cte_TD.A_ID
            LEFT JOIN A_C ON A_C.A_ID = A.A_ID 
                         AND cast(A_C.R AS CHAR) = cast(cte_TD.TDValue AS CHAR)
        LEFT JOIN TD2 ON TD2.H_ID = H.H_ID 
                     AND TD2.A_ID = A.A_ID 
                     AND TD2.Version = cte_Tdata.Version 

WHERE 
    H.Info = 1;
于 2013-04-12T18:04:02.917 に答える