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
但结果相同
答案 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;