0

複数の行にまたがる可能性のある重複が存在する可能性のあるテーブルがあります。

たとえば、部門を含む Employee テーブルを考えてみましょう。

DEPTId 名前 SALARY

1トム121

1 マーク 21

1 サリー 34

2 ジェイ 342

2 ブリトニー 3

3 トム 121

3 マーク 21

3 サリー 34

4 マーク 21

4 サリー 34

5 マーク 21

5 サリー 34

5トム121

5 ブリトニー 3

ここで as 3 を渡す場合、3 は本質的に 1 と同じであるため、1DeptIdを取得する必要があります。DeptId

5 は行数が多いため、1 と同じではありません。すべての行が一致し、重複しています。

単一のクエリを使用して検索する方法を知ることができますか?

4

1 に答える 1

0

セット内の2つのセット(部門内の従業員)を比較しようとしています。

セットベースのアプローチは、テーブルで自己結合を実行し、従業員ごとに照合することです。2つの部門による次のグループ。2つの部門の従業員が同じ場合、すべての従業員が一致します。つまり、一方の部門の従業員がもう一方の部門の従業員と一致しない場合はありません。

句はこのhaving条件をテストします。

このバージョンのクエリでは、ドライバテーブルを使用して、部門と従業員を照合します。セットが一致しない場合、完全な外部結合には一致しない行があり、これは次のhaving句で取得されます。

select driver.deptid1, driver.deptid2
from (select d1.deptid as deptid1, d2.deptid as deptid2
      from (select distinct deptid from employees) d1 cross join
           (select distinct deptid from employees) d2
     ) driver left outer join
     employees e1
     on e1.deptid = driver.deptid full outer join
     employees e2
     on driver.deptid2 = e2.deptid and e1.name = e2.name and e1.salary = e2.salary
group by driver.deptid1, driver.deptid2
having SUM(case when e1.name is null then 1 else 0 end) = 0 and
       SUM(case when e2.name is null then 1 else 0 end) = 0
于 2013-02-19T17:21:35.747 に答える