0

病棟管理者以外のスタッフを表示したい。

病棟管理者を表示する次のクエリがあります。

SELECT Name, Grade, WardManager, StaffNo  
FROM STAFF, WARD   
WHERE WARD.WardManager = STAFF.StaffNo;  

しかし、病棟管理者以外のスタッフを表示する方法がわかりません。IS NOT、NOT LIKE、NOT IN などの組み合わせを試しましたが、どれも機能していないようです。

4

2 に答える 2

1

テーブル構造を正しく理解しているかどうかはわかりませんが、誰かがNOT IN行を返さないと不平を言う場合、ほとんどの場合、IN演算子に使用される列の NULL 値に問題があります。

これを試してください:

select *
from staff
where staffno not in (select wardmanager 
                      from ward 
                      where wardmanager IS NOT NULL)
于 2012-08-09T11:39:02.117 に答える
0

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 )

繰り返しになりますが、速度と効率は、状況とテーブル内の行数によって決まります。

于 2012-08-09T12:32:49.180 に答える