[英]Left Join not retrieving NULL value for the conditional field
我试图通过联接从两个表中检索值,但是第二列中缺少几个值。
例如
valuetable
----------------------
| id |orderid| prodid|
----------------------
| 1 | NULL | 4|
----------------------
| 1 | A | 4|
----------------------
| 2 | NULL | 4|
----------------------
| 2 | NULL | 3|
----------------------
| 3 | B | 4|
----------------------
| 3 | B | 3|
----------------------
| 3 | B | 5|
----------------------
Nametable
--------------
| id | Name|
--------------
| 1 | Apple|
--------------
| 2 | Ball|
--------------
| 3 | Cat|
--------------
| 4 | Dog|
--------------
我有上面的两张桌子。 我必须以以下格式检索值。
查询结果
----------------------
| id | Name|orderid|
----------------------
| 1 | Apple| NULL |
----------------------
| 2 | Ball| NULL |
----------------------
| 3 | Cat| B |
----------------------
| 4 | Dog| NULL |
----------------------
我已经使用以下查询
SELECT nt.id, nt.[Name]
, MIN(vt.orderid) AS orderid
FROM Nametable nt LEFT OUTER JOIN valuetable vt
ON nt.id = vt.id
WHERE
vt.prodid = 3
GROUP BY
nt.id, nt.[Name]
但缺少| 1 | Apple| NULL |
| 1 | Apple| NULL |
行。 我怎样才能找回它? 使用MSSQL Server 2005
值表的prodid = 3的ID值不为1,但我需要以上述方式生成结果。 意味着如果无法从对应产品的值表中获取ID,则它仍应使用ID为NULL值的orderid检索ID及其名称。
好像你有
WHERE vt.prodid = 3
valuetable不包含prodid = 3的Apple
因此,您不应在where中,而应在join子句中:
SELECT nt.id, nt.[Name]
, MIN(vt.orderid) AS orderid
FROM Nametable nt LEFT OUTER JOIN valuetable vt
ON nt.id = vt.id AND vt.prodid = 3
GROUP BY
nt.id, nt.[Name]
空值将被忽略,因为您使用的是聚合函数(MIN())。 如果将结果输出为文本,则应该看到此警告。 您的示例查询也有vt.prodid = 3 where子句,该子句显然会排除您要查找的行
问题似乎出在您的where条件上,因为您执行了左连接,因此vt.Prod_id可能为null(因此不是3)。
如果您想要ID为3的产品的所有Nametable条目(例如,所有名称,如果未映射产品则为null)(即使没有条目),也可以尝试:
SELECT nt.id, nt.[Name]
, MIN(vt.orderid) AS orderid
FROM Nametable nt LEFT OUTER JOIN valuetable vt
ON nt.id = vt.id
WHERE
(vt.prodid is null or vt.prodid = 3)
GROUP BY
nt.id, nt.[Name]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.