我试图通过加入从两个表中检索值,但第二列中的值很少。
例如
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 |
行。我怎样才能找回它?
使用MSSQL Server 2005
值表没有id值1,但我需要以上述方式得到结果。意味着如果它无法从相应的prodid的valuetable获取id,它仍然应该使用NULL值作为orderid检索id及其名称。
答案 0 :(得分:3)
好像你有
WHERE vt.prodid = 3
valuetable不包含带有prodid = 3的Apple
所以你不应该在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]
答案 1 :(得分:0)
因为您正在使用聚合函数(MIN()),所以将忽略空值。如果您将结果输出为文本,则应该看到此警告。您的示例查询还有vt.prodid = 3 where子句,它显然会排除您正在寻找的行
答案 2 :(得分:0)
问题似乎是你的条件,因为你执行左连接,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]