2016-10-25 21 views
0

テーブル "製品" であるNULLフィールドを選択:のSQL Server:外部キー

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 

質問: 2番目の注文を表示する方法は? (その注文の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

使用 'LEFT JOIN' –

答えて

0

明白な解決策はleft joinです:

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

あなたはまた、WRができite:

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

ORはおそらくこのクエリのパフォーマンスに影響します。

0

これは、Inner Joinを使用しているためです。具体的にはProductIDと一致しているからです。 1つはもちろんNULLなので、それはマッチしません。製品表に一致するかどうかに関係なく、Order表のすべての結果を戻す場合は、LEFTおよびRIGHT OUTER JOINSなどの他のタイプの結合を調べる必要があります。

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 
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; 
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; 
関連する問題