这是我的查询-
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
答案 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