2016-07-19 17 views
1

次の2つのクエリを実行すると、2つの異なる回答が得られます。私は本当に理由を知りたいです。 LEFT JOINですか?それは操作の順序ですか?これは他のJOIN型でも発生しますか?JOIN句とWHERE句の比較

最初のクエリ

SELECT 
First_Name 
, E.Employee_ID 
, I.Employee_REF_ID 
FROM Employee AS E 
LEFT JOIN Incentives AS I 
ON (E.Employee_ID = I.Employee_REF_ID) AND (I.Employee_Ref_Id IS NOT NULL); 

出力

1. First_Name Employee_ID Employee_REF_ID 
2. John 1 1 
3. John 1 1 
4. Michael 2 2 
5. Michael 2 2 
6. Roy 3 3 
7. Tom 4 NULL 
8. Jerry 5 NULL 
9. NULL 6 NULL 
10. TestName1 7 NULL 
11. Lname% 8 NULL 

2番目のクエリ

SELECT 
First_Name 
, E.Employee_ID 
, I.Employee_REF_ID 
    FROM Employee AS E 
LEFT JOIN Incentives AS I 
ON (E.Employee_ID = I.Employee_REF_ID) 
WHERE I.Employee_Ref_Id IS NOT NULL; 

出力

1. First_Name Employee_ID Employee_REF_ID 
2. John 1 1 
3. Michael 2 2 
4. Roy 3 3 
5. John 1 1 
6. Michael 2 2 

オリジナルコードhttp://narendra86.blogspot.com/2013/10/top-80-sql-query-interview-questions.html

+0

より良い私たちに参加しているテーブルのサンプルデータを表示 - 詳細については、このstackoverflowの答えは

チェック。 – ydoow

+0

LEFT結合は、結合述部に一致するものがない場合、NULL列を戻します。 WHEREフィルタを追加して、左結合テーブルのフィールドがNULLでないかどうかを確認することで、INNER JOINを再作成したことがあります。 –

+0

それはかなり鋭いです。ありがとうございました。 –

答えて

0

JOINは、設定した条件に基づいて2番目のテーブルを最初のテーブルにリンクすることができます。

最初のクエリでは、 LEFT JOINは、一致するものがない場合は、結合テーブルNULLのすべての列を提供します。

2番目のクエリでは、WHERE句でこれらの一致しないレコードが削除され、NULLというレコードがありません。

テーブルにサンプルデータを提供できるかどうかをよりよく説明できます。

-2

ORDER BY句を使用して、必要な順序を強制する必要があります。たとえば:

SELECT 
First_Name 
, E.Employee_ID 
, I.Employee_REF_ID 
FROM Employee AS E 
LEFT JOIN Incentives AS I 
ON (E.Employee_ID = I.Employee_REF_ID) AND (I.Employee_Ref_Id IS NOT NULL) 
ORDER BY First_Name ASC; 
+0

質問には関係しませんが、Join述語には関係しないORDER BYは、「決定論的」という用語とともに説明する必要があります。 –

1

は、一例として、これを持っ:

declare @table1 table (emp_id int, name varchar(10)) 
declare @table2 table (emp_ref_id int, ref_name varchar(10)) 

insert into @table1 values (1, 'emp1'), (2, 'emp2'), (3, 'emp3') 
insert into @table2 values (1, 'empref1'), (2, 'empref2') 

このクエリ:

select * 
from @table1 t1 
left join @table2 t2 on t1.emp_id = t2.emp_ref_id and t2.emp_ref_id is not null 

リターン:

emp_id name emp_ref_id ref_name 
1  emp1 1   empref1 
2  emp2 2   empref2 
3  emp3 NULL  NULL 

しかし、このクエリ:

をの
select * 
from @table1 t1 
left join @table2 t2 on t1.emp_id = t2.emp_ref_id 
where t2.emp_ref_id is not null 

戻り値:

emp_id name emp_ref_id ref_name 
1  emp1 1   empref1 
2  emp2 2   empref2 

差は、右の表は、一致する行を持たない場合であってもそう左ジョインているため最初のクエリにt2.emp_ref_id is not null条件は効力を持たないことであり、これらの列はnullとして戻されます。 2番目のクエリで条件t2.emp_ref_id is not nullが照会から返されたものと照合され、null emp_ref_idの行が削除されます。

別の例は:

declare @table1 table (emp_id int, name varchar(10)) 
declare @table2 table (emp_ref_id int, ref_name varchar(10), col3 varchar) 

insert into @table1 values (1, 'emp1'), (2, 'emp2'), (3, 'emp3') 
insert into @table2 values (1, 'empref1', 'a'), (2, 'empref2', null) 

select * 
from @table1 t1 
left join @table2 t2 on t1.emp_id = t2.emp_ref_id and t2.col3 is not null 

が返されます:

emp_id name emp_ref_id ref_name col3 
1  emp1 1   empref1  a 
2  emp2 NULL  NULL  NULL 
3  emp3 NULL  NULL  NULL 

をこのクエリを使用する場合:

select * 
from @table1 t1 
left join @table2 t2 on t1.emp_id = t2.emp_ref_id 

それを返すを:

emp_id name emp_ref_id ref_name col3 
1  emp1 1   empref1  a 
2  emp2 2   empref2  NULL 
3  emp3 NULL  NULL  NULL 

ご覧のとおり、左結合のため、条件がand t2.col3 is not nullの場合、左結合は@ table2から一致する行を見つけることができませんが、null値とともにtable2からの行を返します。道のLeft joinが評価されるため

0

あなたの結果が異なっている - 私たちは右にNULLを取得 - ON句の条件を持つことは、あなたがON句を持っている場合(WHERE句で同等の状態を有するとは異なる結果を与えることができます一致がない場合はWHERE句に行がフィルタされます)。 SQL join: where clause vs. on clause