2016-05-18 7 views
1

1つのテーブルに178行、特定の順序で179行がありますが、何を問わずSQLクエリを取得して179行を表示することはできません。それは私に178行だけを示しています。左結合でSQL Serverのすべての行が返されない

SELECT 
    rl.po, rl.item_id, rl.pieces_received, 
    ol.order_id, ol.item_id, ol.pieces_shipped 
FROM 
    receipt_lines rl 
LEFT JOIN 
    hi_order_lines ol ON rl.item_id = ol.item_id 
WHERE 
    ol.order_id = 'TR0202379' 
    AND rl.po = 'TR0202379' 

私はまた、クエリの他のバリエーションの中で

SELECT 
    rl.po, rl.item_id, rl.pieces_received, 
    ol.order_id, ol.item_id, ol.pieces_shipped 
FROM 
    receipt_lines rl 
LEFT JOIN 
    hi_order_lines ol ON rl.item_id = ol.item_id 
         AND ol.order_id = 'TR0202379' 
         AND rl.po = 'TR0202379' 

を試してみましたが、私は間違っている可能性がありますかわかりません。ただ、可視化の目的のためにいくつかのデータを追加すること

..

PO       item_id  pieces_received order_id    item_id     pieces_shipped  
TR0202379    CM504438-BLK- M    77 TR0202379    CM504438-BLK- M    77 
TR0202379    CM504438-BLK-XXL    14 TR0202379    CM504438-BLK-XXL    14 
TR0202379    CM504438-BLK- S    32 TR0202379    CM504438-BLK- S    32 
TR0202379    CM504438-LDN- XL    2 TR0202379    CM504438-LDN- XL    2 

すべてのヘルプは大歓迎です。

おかげ

+0

残っているテーブルを参照する述語がどこにある場合、その左結合を内側結合に変えています。代わりに "ol.order_id = 'TR0202379'"を結合条件に移動してみてください。 –

+0

何を意味するのかわからない、私の2番目の例のようなものを参照していますか?あなたは例を挙げて説明できませんか? – user2797021

+0

これは: 'ol.order_id = 'TR0202379''は、これが真である行だけを確実に取得します。それを 'ON'節に移動します。 –

答えて

1

を、この行く与えます。

SELECT 
    rl.po, rl.item_id, rl.pieces_received, 
    ol.order_id, ol.item_id, ol.pieces_shipped 
FROM 
    receipt_lines rl 
LEFT JOIN 
    hi_order_lines ol ON rl.item_id = ol.item_id 
         AND ol.order_id = 'TR0202379' 
WHERE rl.po = 'TR0202379' 

これはReceipt_Linesは179行を持つテーブルであると仮定されます。それがhi_order_linesの場合は、このようなテーブルを丸める(私は右の結合を本当に嫌う)このようにする必要があります。

SELECT 
    rl.po, rl.item_id, rl.pieces_received, 
    ol.order_id, ol.item_id, ol.pieces_shipped 
FROM 
    hi_order_lines ol 

LEFT JOIN receipt_lines rl 
    ON rl.item_id = ol.item_id 
         AND rl.po = 'TR0202379' 
WHERE ol.order_id = 'TR0202379' 
+0

これはうまくいった!ありがとうございます.. – user2797021

+0

それは素晴らしいです。好奇心の外に、それはあなたのために働いている最初または2番目ですか? –

+0

2番目の作業。 2つのテーブルを比較するために使用する必要があるため、余分な行の場所に関係なくこのクエリを書く方法があるのだろうかと思います。 – user2797021

1

は、両方のテーブルのすべてのレコードのidがTR0202379が、それは左表のhi_order_linesが178行を持つ表であるということでなければならないと仮定すると。右結合を使用してみてください。

+0

178行が返された – user2797021

0

LEFT JOINを使用しているため、あなたのケースの左側のテーブルである「receipt_lines」に参加しているため、常に178行が取得されます。LEFT JOINには、代わりに、RIGHT JOINを試してみてください。そうすれば、残りの行にreceipt_linesのnullが与えられます。

SELECT rl.po,rl.item_id, rl.pieces_received,ol.order_id,ol.item_id,ol.pieces_shipped FROM receipt_lines rl 
RIGHT JOIN hi_order_lines ol 
ON rl.item_id=ol.item_id 
WHERE ol.order_id='TR0202379' AND rl.po='TR0202379' 

または次のようにあなたがあなたのクエリを切り替えることができます:私はあなたの第二の例ではほとんどありだと思う

SELECT rl.po,rl.item_id, rl.pieces_received,ol.order_id,ol.item_id,ol.pieces_shipped FROM hi_order_lines ol 
LEFT JOIN receipt_lines rl 
ON rl.item_id=ol.item_id 
WHERE ol.order_id='TR0202379' AND rl.po='TR0202379' 
+0

178行が返された – user2797021

+0

欠落している行は何か分かりますか? –

関連する問題