我试图从数据库中获取一些数据。我有一个Taak
表,其中包含可能的idPartij
列。可能,因为它可以是真实idPartij
,但也可以是null
。
我得到的查询:
SELECT T.idTaak,
T.Taaktype,
P.Partijnaam,
T.Naar,
T.UltimatumDatum,
T.Opmerking,
T.Status,
T.Prioriteit
FROM Taak AS T,
Partij AS P
WHERE T.idPartij = P.idPartij
ORDER BY idTaak DESC
当我在T.idPartij
中获得了ID时,此功能正常,但如前所述,该ID可以是null
。在这种情况下,行不会出现在结果中。
唯一的问题:当我删除where子句时,我会得到很多行(因为Partij
表格不再被过滤...
我是SQL的总菜鸟,所以我无法想出一种解决问题的方法。这个问题。我唯一能想到的就是创建2个查询,但我不认为这是一个很好的方法...
答案 0 :(得分:4)
由于您尝试链接两个表,因此应使用LEFT OUTER JOIN
代替:
SELECT T.idTaak,
T.Taaktype,
P.Partijnaam,
T.Naar,
T.UltimatumDatum,
T.Opmerking,
T.Status,
T.Prioriteit
FROM Taak AS T LEFT OUTER JOIN Partij AS P
ON T.idPartij = P.idPartij
ORDER BY idTaak DESC
如果您不想包含NULL
值,请改用INNER JOIN
。
请注意,您不应使用这些旧式连接it's a bad habit to kick。
根据NULL
问题:
您无法使用= NULL
或<> NULL
,因为NULL
不等于或不等于任何内容。 NULL
意味着未知。
因此请使用IS NULL
或IS NOT NULL
:
WHERE T.idPartij IS NULL OR T.idPartij = P.idPartij
来自MSDN
值为NULL表示该值未知。值为NULL 不同于空值或零值。没有两个空值 等于。两个空值之间或NULL与任意之间的比较 其他值,返回未知因为每个NULL的值未知。
答案 1 :(得分:2)
您没有指定数据库平台,因此使用ANSI语法是安全的。
在coalesce
为P.idPartij
时,T.idPartij
与null
进行比较:
where P.idPartij = coalesce(T.idPartij, P.idPartij)
如果T
为T.idPartij
,则会匹配所有null
行。
如果您想在T
为idPartij
时不返回null
行,请使用left outer join
:
from Taak t
left
outer
join Partij p
on t.idPartij = p.idPartij
答案 2 :(得分:0)
您需要使用左连接来获取缺失的行,而不是内连接。
WHERE T.idPartij = P.idPartij OR T.idPartij IS NULL
答案 3 :(得分:0)
如果要连接表以便(a)非空等效ID匹配,并且(b)null Ids匹配,那么您的查询应该如下所示:
SELECT T.idTaak,
T.Taaktype,
P.Partijnaam,
T.Naar,
T.UltimatumDatum,
T.Opmerking,
T.Status,
T.Prioriteit
FROM Taak AS T INNER JOIN Partij AS P
ON T.idPartij = P.idPartij OR T.idPartij IS NULL AND P.idPartij IS NULL
ORDER BY idTaak DESC