病棟管理者以外のスタッフを表示したい。
病棟管理者を表示する次のクエリがあります。
SELECT Name, Grade, WardManager, StaffNo
FROM STAFF, WARD
WHERE WARD.WardManager = STAFF.StaffNo;
しかし、病棟管理者以外のスタッフを表示する方法がわかりません。IS NOT、NOT LIKE、NOT IN などの組み合わせを試しましたが、どれも機能していないようです。
テーブル構造を正しく理解しているかどうかはわかりませんが、誰かがNOT IN
行を返さないと不平を言う場合、ほとんどの場合、IN
演算子に使用される列の NULL 値に問題があります。
これを試してください:
select *
from staff
where staffno not in (select wardmanager
from ward
where wardmanager IS NOT NULL)
a_horse_with_no_name の答えに代わるものを与えるために、これは a で行うこともできますleft outer join
:
select s.*
from staff s
left outer join ward w
on s.staffno = w.wardmanager
where w.wardmanager is null
これは、必要なものに参加することで機能しますが、一致しない値を要求します。
どちらがより速く/より効率的であるかについては、特定の状況に依存するため、両方をテストして確認する必要があります.
関連するデータがward
テーブルにないため (すべての列が null になります)、このテーブルから列を選択しても意味がありません。ただし、a の利点は、join
必要に応じてできることです。たとえば、where
病棟マネージャーのスタッフとそうでないスタッフを返すことができる条項を削除したとします。差別化は、からの列がward
マネージャーではない場合、常に null になることです。
これを行うさらに別の方法は を使用することですwhere exists
が、このようnot in
に から列を返したくない場合にのみ適していますward
。
select s.*
from staff s
where not exists ( select 1
from ward w
where wardmanager = s.staffno )
繰り返しになりますが、速度と効率は、状況とテーブル内の行数によって決まります。