我遇到了一个问题,我一直在讨论这个问题而且我的代码对我有意义,但仍然无效。
以下是问题:
列出所有未使用(潜在)看护人的名单,以及所有无人认领艺术品的名称和类型(尚未有看守的艺术品)。
以下是表格的设置方式:
CareTakers
:CareTakerID, CareTakerName
Donations
:DonationID, DonorID, DonatedMoney, ArtName, ArtType, ArtAppraisedPrice, ArtLocationBuilding, ArtLocationRoom, CareTakerID
Donors
:DonorID, DonorName, DonorAddress
这是我的代码:
SELECT
CareTakerName, ArtName, ArtType
FROM
CareTakers
JOIN
Donations ON CareTakers.CareTakerID = Donations.CareTakerID
WHERE
Donations.CareTakerID = ''
非常感谢任何帮助!
答案 0 :(得分:2)
我会建议两个查询,原因是我在上面对OP的评论中提到的原因......但是,由于您请求了一个查询,以下内容应该可以获得您所要求的内容,尽管结果集并未描述 - 通过侧。
SELECT
CareTakerName, ArtName, ArtType
FROM
CareTakers
LEFT JOIN
Donations ON CareTakers.CareTakerID = Donations.CareTakerID
WHERE
NULLIF(Donations.CareTakerID,'') IS NULL
UNION -- Returns a stacked result set
SELECT
CareTakerName, ArtName, ArtType
FROM
CareTakers
RIGHT JOIN
Donations ON CareTakers.CareTakerID = Donations.CareTakerID
WHERE
NULLIF(CareTakers.CareTakerID,'') IS NULL
如果这还不够,我可以按照上面的建议提供两个单独的查询。
*编辑:包含NULLIF,其中''标准在where子句中同等地处理空白和NULL。
答案 1 :(得分:1)
Donations.CareTakerID = ''
与测试NULL
不同。那是测试一个空字符串。
你想要
Donations.CareTakerID is NULL
另请注意
Donations.CaretakerID = NULL
不会给你你想要的东西(一个常见的错误。)
答案 2 :(得分:1)
使用LEFT JOIN:
SELECT CareTakerName, ArtName, ArtType
FROM CareTakers
LEFT JOIN Donations ON CareTakers.CareTakerID = Donations.CareTakerID
WHERE Donations.CareTakerID IS NULL
答案 3 :(得分:0)
首先,您需要知道什么是 NULL 值。是零,空白还是其他什么?答案是:否。
NULL 不是值,它只表示在创建行时未提供值。
SELECT d.ArtName, d.ArtType
,(SELECT CareTakerName FROM CareTakers c WHERE c.CareTakerID = d.CareTakerID)CareTakerName
FROM Donations d
WHERE ISNULL(d.CareTakerID, 0) = 0
*我喜欢使用"默认" NULL列的值
此处有更多信息:SQL NULL Values