1

次のSQLステートメント:

select * from employees e   
left join departments d on e.deptid = d.deptid   
where ( d.deptname = 'HR' or d.deptname  = 'HR & Accounts')    

次の内部結合と同じ結果が生成されます。

select * from employees e  
   inner join departments d on e.deptid = d.deptid and d.deptname like '%HR%';  

どのようにそれらは同じ結果を生み出します。

つまり、次のような最初のクエリに相当します。

  1. 従業員から*を選択し、場所を使用してフィルタリングします
  2. 左参加しますか?

内部結合と同じにする最初のクエリの手順は何ですか?

4

2 に答える 2

3

外部結合の条件に一致しない行の場合、結合されたテーブルの列の値はNULLです。Where句は、結合が処理されたに(概念的に)発生するため、これらの列をテストする条件はすべてfalse(厳密に言えばNULL)になります。

1つのテーブルのすべての行を含めたいが、条件を満たす2番目のテーブルの行のみに一致する場合は、その条件を外部結合のON句に追加する必要があります。

また、内部結合は一致しない行を破棄するため、内部結合のON句の条件は、Where句の場合と同じ効果があることに注意してください。

于 2013-02-16T11:41:19.783 に答える
1

2番目のクエリでは、結合条件でフィルタリングします。

残った最初のクエリは、deptidを使用して従業員を部門に結合します。可能なすべての結果を返し、where句を使用してフィルタリングします。このフィルタリングは、基本的にクエリを変更して、内部結合クエリと同様の結果を返します。

最初のクエリを変更して、次のようなwhere句が原因で返されないものを表示できます。

select *, CASE WHEN d.deptname = 'HR' or d.deptname  = 'HR & Accounts' THEN 1 ELSE 0 END as HR
from employees e 
left join departments d on e.deptid = d.deptid;
于 2013-02-16T11:42:06.323 に答える