需要帮助来理解这个SQL查询

时间:2016-04-17 08:08:41

标签: sql-server

有人可以帮助我理解这个SQL代码吗? 这实际上让我更加困惑 - END = G.CODE

SELECT something, something
FROM ABCD A
JOIN GHIJ G ON 
    CASE    
        WHEN A.CODE = 'not available' THEN 'NA_CODE'
        ELSE A.CODE END = G.CODE
                   LEFT JOIN PRODUCT P ON P.ID = A.ID
                   WHERE P.ID IS NULL;
GO          

由于 伊莎

2 个答案:

答案 0 :(得分:3)

当您查看格式正确的代码时,您将理解它。

CASE WHEN A.CODE = 'not available' THEN 'NA_CODE' ELSE A.CODE END = G.CODE

考虑像

这样的连接子句
 B.XYZ = G.CODE

其中B.XYZ是一个案例陈述,用于操纵加入列A.CODE以获取值'不可用'到'NA_CODE',以便它可以匹配G.CODE中的相同值。 除了价值'不可用'一切都很好,所以案例陈述只能操纵“不可用”。到'NA_CODE',以便join子句可以将其与G.CODE内的值匹配。

查找案例陈述以了解更多详情。

希望你理解。

这里: -

B.XYZ =[CASE WHEN A.CODE = 'not available' THEN 'NA_CODE' ELSE A.CODE END]

答案 1 :(得分:1)

您需要在此查询中了解更多内容。

对于“CASE ... END = G.CODE”你得到了一个很好的答案 - 事实上,“END”本身并不存在,它是CASE表达式语法中的最后一个关键词。

如果不这样做,请注意您的查询将不返回任何行。这是因为最后你有

...LEFT JOIN PRODUCT P ON P.ID = A.ID
   WHERE P.ID IS NULL

LEFT JOIN中不返回P.ID为“IS NULL”的行 - 仅返回P.ID = A.ID的行和A.ID为NULL的行。 (当P.ID为NULL时,与A.ID的等式是UNKNOWN,因此不返回该行。)