2010-09-07 4 views
3

две таблицы приведеныTSQL Поиск строк в другой таблице

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) 
       ) 
     ) 

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

ответ

3
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) 
+0

Относительно ответа AakashM, просто чтобы пояснить, решение здесь - представить пилотов, обучающихся на всех самолетах, перечисленных в SouthOperation, без необходимости знать, какие самолеты находятся в этой таблице. –

2
SELECT Pilot FROM PilotGroup 
INNER JOIN SouthOperation ON PilotGroup.Plane = SouthOperation.Plane 
GROUP BY Pilot 
HAVING COUNT(SouthOperation.Plane) = 2 
2

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

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

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

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

+0

Мне нравится ваше решение. –

1
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 
2

вопрос вы опубликовали почти точно соответствует примерам в этой статье Джо Селко: Divided We Stand: The SQL of Relational Division, и в самом деле, охватывает тот факт, что «правильный» термин для этого является реляционной разделение.

+0

+1 Вопрос также напомнил мне об этом примере сразу. –

Смежные вопросы