Left Join不检索条件字段的NULL值

时间:2011-08-19 08:21:15

标签: sql sql-server-2005 tsql join

我试图通过加入从两个表中检索值,但第二列中的值很少。

例如

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

更新

对于prodid = 3,

值表没有id值1,但我需要以上述方式得到结果。意味着如果它无法从相应的prodid的valuetable获取id,它仍然应该使用NULL值作为orderid检索id及其名称。

3 个答案:

答案 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]