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 条目的最后一个版本。如果有更好的方法可以做到这一点,请随时告诉我。:-)

C# 中的 SqlCommand 是否存在 MS SQL 中不存在的任何限制,或者我做错了什么?

我将非常感谢任何帮助!

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 回答