SQL情况-即使其他条件为true,也会访问else条件

时间:2020-09-13 17:41:13

标签: sql case

这是我的查询-

Select distinct P1.PastaName, P1.PastaColor,
CASE
    When
  S1.SauceID = P1.PastaID
THEN S1.SauceType
ELSE NULL
END AS PastaCombo
From Pasta P1, Sauce S1

无论Pasta ID和Sauce ID是否匹配,我希望每个Pasta的每个Pasta只返回一行。但是,事实并非如此。如果“面食ID”和“酱汁ID”不匹配,则返回的面食只有一行,且PastaCombo值为null。但是,如果“ Pasta ID”和“ Sauce ID”确实匹配,则会返回两行,表示“ Pasta Combo”和“ null”。

那是为什么?如果存在匹配项并且仅返回“ Pasta Combo”而不是null时,如何将结果减少到一行?

根据此-https://dba.stackexchange.com/questions/43352/does-sql-server-case-statement-evaluate-all-conditions-or-exit-on-first-true-con-else条件仅在没有真实条件时被访问。但是我的确有一个真正的条件,所以我不确定为什么要访问else条件。

这是我想要的结果

PastaName           PastaColor       SauceType
_________           __________       __________

Ravioli              Brown           Tomato

1 个答案:

答案 0 :(得分:1)

与此:

From Pasta P1, Sauce S1

您实际要做的是将两个表进行CROSS连接,这意味着各行的笛卡尔积。
我怀疑您想要的是LEFT联接:

SELECT DISTINCT 
  P1.PastaName, P1.PastaColor,
  CASE WHEN S1.SauceID IS NOT NULL THEN 'Pasta Combo' END AS PastaCombo
FROM Pasta P1 LEFT JOIN Sauce S1
ON S1.SauceID = P1.PastaID

或在没有加入的情况下使用EXISTS

SELECT DISTINCT 
  P1.PastaName, P1.PastaColor,
  CASE WHEN (EXISTS SELECT 1 FROM Sauce S1 WHERE S1.SauceID = P1.PastaID) THEN 'Pasta Combo' END AS PastaCombo
FROM Pasta P1