sql server:选择一个外键的NULL字段

时间:2016-10-25 12:19:31

标签: sql sql-server tsql

表"产品" :

productID      productNAME
21             mouse
22             keyboard

表"顺序" :

orderID      productID
31           21
32           NULL

sql命令:

SELECT dbo.[order].orderID, dbo.product.productNAME
FROM   dbo.[order] 
INNER JOIN dbo.product ON dbo.[order].productID = dbo.product.productID

结果:

orderID      productID
31           mouse

问题: 如何显示第二个订单? (虽然该订单的productID为NULL,但该订单已存在) 那有什么诀窍吗?

我试过这些:

WHERE (dbo.[order].orderID = 32) OR
      (dbo.product.productID IS NULL)

SELECT dbo.[order].orderID, ISNULL(dbo.product.productNAME, ' - ') AS Expr1
FROM  dbo.[order] 
INNER JOIN dbo.product ON dbo.[order].productID = dbo.product.productID

但结果相同

5 个答案:

答案 0 :(得分:0)

明显的解决方案是left join

SELECT o.orderID, p.productNAME
FROM dbo.[order] o LEFT JOIN
     dbo.product p
     ON o.productID = p.productID;

你也可以写:

SELECT o.orderID, p.productNAME
FROM dbo.[order] o JOIN
     dbo.product p
     ON o.productID = p.productID OR o.productID IS NULL;

OR可能会影响此查询的效果。

答案 1 :(得分:0)

这是因为您正在使用内部联接,特别是在ProductID上匹配。因为一个是NULL当然不会匹配。如果您希望返回Order表中的所有结果,无论产品表中是否存在匹配项,您都需要查看其他类型的连接,例如LEFT和RIGHT OUTER JOINS。

答案 2 :(得分:0)

经典的外连接示例!

   SELECT dbo.[order].orderID, ISNULL(dbo.product.productNAME, ' - ') AS Expr1
     FROM dbo.[order] 
LEFT JOIN dbo.product ON dbo.[order].productID = dbo.product.productID

答案 3 :(得分:0)

你必须使用OR条件和内连接。

SELECT o.orderID
    ,p.productNAME
FROM dbo.[order] o
INNER JOIN dbo.product p ON o.productID = p.productID
    OR o.productID IS NULL;

答案 4 :(得分:0)

明显/经典的解决方案是UNION

SELECT dbo.[order].orderID, dbo.product.productNAME
FROM   dbo.[order] 
INNER JOIN dbo.product ON dbo.[order].productID = dbo.product.productID
UNION
SELECT dbo.[order].orderID, '{{NONE}}' AS productNAME
FROM   dbo.[order] 
WHERE  dbo.[order].productID IS NULL;