2016-05-12 4 views
-1

に親表Aに子テーブルBに参加する場合の結果は、マルチ参加テーブルクエリで変化する場合、私は思ってきました。あなたが親表SQLロジック:A.FID = B.ID

A   B 
ID|FID  FID 
    1|2  1 
    2|4  2 
    3|5  3 
    4|7  4 
    5|8  5 
    6|NULL 6 
    7|NULL 7 
    8|NULL 8 

をお持ちの場合は

は、あなたがWHERE句で指定されたテーブルの列は関係ありませんか?例えば 、2つの違いは何です:

Select * 
From Table A 
Left Join B on A.FID = B.FID 
WHERE A.FID IN (2,5,8) 

Select * 
From Table A 
Left Join B on A.FID = B.FID 
WHERE B.ID IN (2,5,8) 

が助けてくれてありがとう!

EDIT: あなたの答えは良いもの(おそらく彼が探しているのは1)である間、彼のクエリの両方が、本質的にフィルタリングしていることから、マイケルは私の質問を解決したと私は実際には」

をそれをテストしていますB(A.FID、B.ID)のプライマリ・キーでは、実際には論理的には同じです(A.FIDはBの真の外部キー制約であると仮定します)。つまり、両方のクエリーは、B.IDが2,5または8でない行を除外します。これはメインテーブルとして持つと同じになりますが

SELECT * 
FROM B 
LEFT JOIN A ON A.FID = B.FID 
WHERE B.FID IN (2,5,8) 

: - マイケル・L.は

それが異なるだけであるが、表Bがメインテーブルであり、あなたがのようにB.IDに基づいて照会されます:

SELECT * 
FROM B 
LEFT JOIN A ON A.FID = B.FID 
WHERE A.FID IN (2,5,8) 
+1

あなたはそれを試してみたのですか?実際 –

+0

[なJOINのSQL JOINと異なる種類]の可能な重複(http://stackoverflow.com/questions/17946221/sql-join-and-different-types-of-joins) –

答えて

5

はい、あります。

あなたがOUTER JOINを使用

、テーブルの1からの値が NULLかもしれません。 NULL値が除外されているので

Select * 
From Table A Inner Join 
    B 
    on A.FID = B.ID 
WHERE B.ID IN (2, 5, 8); 

:だから、2番目のクエリは同等です。 LEFT JOINとの一般的な規則として

最初テーブルに

  • フィルタはWHERE句に属します。
  • 2番目以降のテーブルのフィルタは、ON句に指定する必要があります。
+1

、あなたの答えは良いものである一方、両方のクエリが本質的に 'B'の主キー(' A.FID'、 'B.ID')をフィルタリングしているので、それらは実際には論理的に同じです(' A .FID'は 'B'の本当の外部キー制約です)。つまり、両方のクエリは 'B.ID'が2,5または8でない行を除外します。 –

+0

Micheal、A.FIDは真の外部キーです。これに関するテキストはありますか? –

+0

あなたは結合についてのドキュメントを意味しますか? Pinal Daveの[SQL結合入門](http://blog.sqlauthority.com/2009/04/13/sql-server-introduction-to-joins-basic-of-joins/)は、開始するのに適しています。 [SQL結合のビジュアル表現](http://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins)も参考になります。 –

関連する問題