2016-10-27 5 views
0

私は探していますが、これに対する答えを見つけることができないので、誰かが助けてくれることを望んでいます。私は私が欲しいものを表2(資産)SQL Join/WHEREの問題

asset_number location<br> 
1   15 
2   10 
3   15 

を表2にではなく、表に表示された資産のテーブル2つのテーブル

表1(監査済項目)

audit_session_id asset_number 
Audit1    1  
Audit1    2  
Audit2    3  

を持っています1を指定し、audit_session_idを指定します。私が持っていることである:それはNULLであるよう

SELECT a.asset_number 
FROM auditeditems ai 
RIGHT JOIN asset a 
    on ai.asset_number = a.asset_number 
WHERE ai.asset_number IS NULL 
AND a.location_id=15; 

は、しかし、私はaudit_session_idにフィルタリングすることはできません。だから私は結果を得る:

1,3それはちょうど1(Iはaudit1セッションを見ていたと仮定した場合)

あるべきときに私は、これはまっすぐでなければなりません考えておくが、私は「場所を確認することはできません私は間違っています。ありがとうございました

+2

実際のところ、右のジョインは非常にまれです。 – Strawberry

+1

多くの人が左への参加を理解するのが難しいと感じています。だから、私のアドバイスは、常に左に参加することです。 'オプションのデータ右結合メインテーブル 'ではなく、'メインテーブルの左のオプションのデータ結合 'を理解するのがずっと簡単です。 – jarlh

+0

私は上記のポスターに同意します。もし私がコードレビューをしていて、正しい参加を見たなら、すぐにそのコードに失敗するでしょう。非常に限定されたシナリオでのみ役立ちます。 –

答えて

0

を、私はあなたがON句で条件を入れたいと考えている:

SELECT a.asset_number 
FROM auditeditems ai 
    asset a LEFT JOIN 
    auditeditems ai 
    ON ai.asset_number = a.asset_number AND 
     ai.audit_session_id = 'Audit1' 
WHERE ai.asset_number IS NULL AND a.location_id = 15; 
0

あなたはうわー参加しました。試してみてください:

select A1.* 
from Asset A1 
left join AuditedItems A2 
    on A1.asset_number = A2.asset_number 
where A1.location_id = 15 
and A2.asset_number is null 
+0

これはありがとうございますLEFT JOINですが、私はまだ特定のaudit_session_idの結果しか取得できないことがわかります。このクエリは、特定のaudit_session_idのものだけでなく、audited_itemsのすべてのデータと一致するようです。 – Lee

+0

@Lee私よりもはるかにスマートな人が説明できるようになるでしょう、私は知っています右はmySQL – JohnHC

0

は、特定の資産を見つけるためにJOINを使用する「抗そして、あなたが望むセッションと場所に監査さ他のすべてのアセットを見つけるには、他のすべてのアセットを見つけてください:

SELECT asset_number 
    FROM asset 
WHERE asset_number NOT IN (SELECT asset_number 
           FROM asset 
            NATURAL JOIN 
            auditeditems 
           WHERE audit_session_id = 'Audit1' 
            AND location_id = 15);