私はSQLクエリーを作成したいが、従業員がEMPテーブルに割り当てられていないDEPTテーブルから部門名を取得したい。従業員が割り当てられていない従業員を取り出す
テーブルの構造:
EMP
EMPNO ENAME DEPTNO
DEPT
DEPTNO DNAME
だから、私は、従業員の関連性を持っていないものをDEPTを知りたいです。
私はSQLクエリーを作成したいが、従業員がEMPテーブルに割り当てられていないDEPTテーブルから部門名を取得したい。従業員が割り当てられていない従業員を取り出す
テーブルの構造:
EMP
EMPNO ENAME DEPTNO
DEPT
DEPTNO DNAME
だから、私は、従業員の関連性を持っていないものをDEPTを知りたいです。
イッツしないとだけ正しいは
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または
select dname from dept where deptno not in (select deptno from emp)
すべての従業員に部門があることを望みましょう。 CEOは部門を持っておらず、deptnoはNULLになる可能性があります=失敗... – gbn
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
が必要ではないことを指摘していない - でも、それなしで重複を部門が返されます。
それは動作しますが、なぜあなたは別のものを使用していますか? –
@bernd_k:EMPごとに1つの行が表示されます。 DISTINCTが必要です。後で追加されたので、編集として表示されません。 – gbn
@gbnただしwhere句で除外された部分。結合されていない部門には重複はありません。 DISTINCTは必要ありません –
SELECT D.DEPTNO
FROM EMP E
JOIN DEPT D ON D.DEPTNO = E.DEPTNO (+)
WHERE E.EMPNO IS NULL;
DNAME NOT INは(EMPは異なるEMP.DNameを選択しDEPTから選択DNAME EXCEPT、NOTを失敗します);
あなたは数字がemp表には存在しないdept表からこれらの部門を選択することができます
SELECT dname
FROM dept
WHERE deptno
NOT IN (SELECT DISTINCT deptno
FROM emp);
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
は、どの部門にも所属していない従業員に与えます。
このコードを読んでいただきありがとうございます。適切な説明(* meta.stackexchange.com/q/114762)は、*なぜ*これが問題の良い解決策であるかを示すことで長期的な価値を向上させ、将来の読者にとって他の同様の質問。あなたの前提を含め、あなたの答えを[編集]して説明を加えてください。 –
以下を除いてかいずれかを使用していないとパフォーマンスが賢明それは右の持つd.dnameでe.deptno = d.deptno グループにDEPT dを参加EMP eから選択d.dname
優れていますカウント(例えば、empno)= 0
左結合を使用してNULLをチェックするか、サブクエリを使用できます –