2010-12-28 8 views
1

私はSQLクエリーを作成したいが、従業員がEMPテーブルに割り当てられていないDEPTテーブルから部門名を取得したい。従業員が割り当てられていない従業員を取り出す

テーブルの構造:

EMP 
EMPNO ENAME DEPTNO 

DEPT 
DEPTNO DNAME 

だから、私は、従業員の関連性を持っていないものをDEPTを知りたいです。

+0

左結合を使用してNULLをチェックするか、サブクエリを使用できます –

答えて

5

イッツしないとだけ正しい

SELECT D.DNAME 
FROM DEPT D 
WHERE 
NOT EXISTS (SELECT * FROM EMP E WHERE D.DEPTNO = E.DEPTNO) 

またはEXCEPT、両方が(左反半が参加して)同じプランを与える必要があります

SELECT D.DNAME 
FROM DEPT D 
EXCEPT 
SELECT D.DNAME 
FROM DEPT D 
JOIN 
EMP E WHERE D.DEPTNO = E.DEPTNO 

この場合は、より複雑な

EXISTS

他の回答への注意:

  • LEFT JOINは従業員1人あたり1行を与えます。 DISTINCTが必要です。 NOT EXISTSと比較して計画を妥協するもの

  • NOT INは部門がない従業員がいる場合、誤った結果を与えます。 NOT INリストでNULLと

ので一般 1を使用する必要がありますEXISTSまたは

+0

試したdbmsに関する情報を追加できますか? Oracleでは、最初の問合せでは反結合(データの分布に応じてハッシュまたはnl)が生成されますが、2番目の問合せでは結果が2種類になります。 – Ronnis

+0

@ロンニス:SQLサーバー。経験とこれに基づいてhttp://stackoverflow.com/questions/4249891/combining-datasets-with-except-versus-checking-on-is-null-in-a-left-join/4249958#4249958 – gbn

4
select dname from dept where deptno not in (select deptno from emp) 
+0

すべての従業員に部門があることを望みましょう。 CEOは部門を持っておらず、deptnoはNULLになる可能性があります=失敗... – gbn

1
SELECT D.DNAME 
FROM DEPT D 
LEFT JOIN EMP E ON D.DEPTNO = E.DEPTNO 
WHERE E.DEPTNO IS NULL 

UPDATE:

@bernd_kは、この場合には( DISTINCT D.DNAME ...を選択)DISTINCTが必要ではないことを指摘していない - でも、それなしで重複を部門が返されます。

+0

それは動作しますが、なぜあなたは別のものを使用していますか? –

+1

@bernd_k:EMPごとに1つの行が表示されます。 DISTINCTが必要です。後で追加されたので、編集として表示されません。 – gbn

+1

@gbnただしwhere句で除外された部分。結合されていない部門には重複はありません。 DISTINCTは必要ありません –

1
SELECT D.DEPTNO 
FROM EMP E 
JOIN DEPT D ON D.DEPTNO = E.DEPTNO (+) 
WHERE E.EMPNO IS NULL; 
1

DNAME NOT INは(EMPは異なるEMP.DNameを選択しDEPTから選択DNAME EXCEPT、NOTを失敗します);

1

あなたは数字がemp表には存在しないdept表からこれらの部門を選択することができます

SELECT dname 
FROM dept 
WHERE deptno 
NOT IN (SELECT DISTINCT deptno 
FROM emp); 
+0

あなたのコードが行うことの短い説明) – junkfoodjunkie

+0

@junkfoodjunkie –

+0

@junkfoodjunkie done –

0
select x.DEPTNO from dept x where x.DEPTNO not in 
(select d.DEPTNO from department d join 
employee e where e.deptid=d.DEPTNO) 

サブクエリが部門に関連付けられているすべての従業員を取得するために使用されます。

select d.DEPTNO from department d join 
employee e where e.deptid=d.DEPTNO 
and using select x.DEPTNO from dept x where x.DEPTNO 

not inは、どの部門にも所属していない従業員に与えます。

+0

このコードを読んでいただきありがとうございます。適切な説明(* meta.stackexchange.com/q/114762)は、*なぜ*これが問題の良い解決策であるかを示すことで長期的な価値を向上させ、将来の読者にとって他の同様の質問。あなたの前提を含め、あなたの答えを[編集]して説明を加えてください。 –

0

以下を除いてかいずれかを使用していないとパフォーマンスが賢明それは右の持つd.dnameでe.deptno = d.deptno グループにDEPT dを参加EMP eから選択d.dname

優れていますカウント(例えば、empno)= 0

関連する問題