TSQL Поиск строк в другой таблице - PullRequest
3 голосов
/ 07 сентября 2010

Даны две таблицы

Таблица PilotGroup

Pilot            Plane  

Jon Smith      A1-Fighter
Jon Smith   B1-Fighter
Gravell     A2-Fighter
Jon Skeet   A1-Fighter
Jon Skeet   B1-Fighter
Jon Skeet   A4-Fighter
Gravell     A5-Fighter

Таблица SouthOperation

Plane
A1-Fighter
B1-Fighter

Задачанапечатать имена пилотов, которые обучаются как на A1-Fighter, так и на B1-Fighter.

Я получил результат, выполнив

select distinct pilot from PilotGroup  as pg1
   where not exists
        ( 
           select * from SouthOperation Sop where 
              not exists
              ( 
                select *from PilotGroup  as pg2 where ( pg1.pilot = pg2.pilot) 
                 and 
                (pg2.plane= Sop.plane)
               )
        )

Есть ли альтернативы для поиска строк в другой таблице

Ответы [ 5 ]

3 голосов
/ 07 сентября 2010
select 
    pilot 
from 
    pilotgroup pg 
    inner join
    southoperation sop on (pg.plane = sop.plane)
group by 
    pilot
having 
    count(pg.plane) = (select count(*) from southoperation)
2 голосов
/ 07 сентября 2010

Вопрос, который вы разместили, почти точно соответствует примерам в этой статье Джо Селко: Разделенное мы стоим: SQL реляционного разделения и действительно охватывает тот факт, что «правильный» термин для это реляционное деление.

2 голосов
/ 07 сентября 2010

Задача состоит в том, чтобы напечатать имена пилотов, которые обучены на A1-Fighter и B1-Fighter.

Если у вас есть эти значения заранее, вам не нужно SouthOperation вообще:

SELECT Pilot FROM PilotGroup WHERE Plane = 'A1-Fighter'
INTERSECT
SELECT Pilot FROM PilotGroup WHERE Plane = 'B1-Fighter'

Если вы на самом деле имеете в виду «напечатать имена пилотов, которые обучены на всех планах в SouthOperation», мой вопрос к вам: есть только две строкив SouthOperation?Или потенциально больше?

2 голосов
/ 07 сентября 2010
SELECT Pilot FROM PilotGroup
INNER JOIN SouthOperation ON PilotGroup.Plane = SouthOperation.Plane
GROUP BY Pilot
HAVING COUNT(SouthOperation.Plane) = 2
1 голос
/ 07 сентября 2010
declare @t table (pilot int, plane int);

insert into @t
 select * from (select 1 pilot, 1 plane union all
select 1, 2 union all
select 2, 1 union all
select 3, 3 union all
select 4, 1 union all
select 4, 2) t

select t1.pilot
from @t t1, @t t2 
where t1.pilot = t2.pilot and t1.plane = 1 and t2.plane = 2
group by t1.pilot
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...