SQL где ограничения - PullRequest
       7

SQL где ограничения

4 голосов
/ 08 декабря 2011

Ниже мой вывод, я хочу отображать только те имена, которые повторяются. Каждое имя - пилот, а номер - тип самолета, на котором летит пилот. Я хочу отобразить имена пилотов, которые управляют более чем одним самолетом. Я использую sql * plus

PIL_PILOTNAME                  DEP_EQUIP_NO 
------------------------------ ------------ 
Gladchuk, Chet                 1085
Gladchuk, Chet                 1345
Green, Edward L.               1489
Harris, Kenneth C.             1253
Leiss, Ernst L.                1194
Long, Stuart                   1081
Pasewark, William B.           1026
Pasewark, William B.           1347
Scamell, Richard               1368

Мой вывод должен отображать только:

PIL_PILOTNAME                  DEP_EQUIP_NO 
------------------------------ ------------ 
Gladchuk, Chet                 1085
Gladchuk, Chet                 1345
Pasewark, William B.           1026
Pasewark, William B.           1347

Вот мой запрос:

select distinct pil_pilotname,dep_equip_no from pilots  join departures
on dep_pilot_id = pil_pilot_id  join equip_type
on eq_equip_no = dep_equip_no
order by pil_pilotname;

Ответы [ 6 ]

2 голосов
/ 08 декабря 2011

В этом случае лучшим вариантом будет использование аналитики

select PIL_PILOTNAME, DEP_EQUIP_NO
from (
        select pil_pilotname,dep_equip_no, count(*) over (partition by pil_pilot_id) as cnt
        from pilots
            join departures on (dep_pilot_id = pil_pilot_id)
            join equip_type on (eq_equip_no = dep_equip_no)
    )
where cnt > 1
order by pil_pilotname;
0 голосов
/ 10 декабря 2011
select pil_pilotname, dep_equip_no
from pilots
inner join departures d on dep_pilot_id = pil_pilot_id
inner join equip_type on eq_equip_no = dep_equip_no
where pil_pilotname in (
  select pil_pilotname 
  from pilots
  inner join departures d on dep_pilot_id = pil_pilot_id
  inner join equip_type on eq_equip_no = dep_equip_no
  group by pil_pilotname
  having count(*) > 1)
order by pil_pilotname;

Это даст вам то, что вам нужно. Внутренний выбор в где делает фильтрацию.

0 голосов
/ 08 декабря 2011

Похоже, что вы ничего не вытаскиваете из таблицы equip_type, в этом случае вам может не потребоваться присоединиться к ней. Здесь я предполагаю, что dep_equip_no является внешним ключом для equip_type.eq_equip_no и поэтому не может содержать значения, не найденные в equip_type.

Имея это в виду, мое решение будет выглядеть так:

SELECT DISTINCT
  p.pil_pilotname,
  d.dep_equip_no
FROM pilots p
  INNER JOIN (
    SELECT dep_pilot_id
    FROM departures
    GROUP BY dep_pilot_no
    HAVING COUNT(DISTINCT dep_equip_no) > 1
  ) s ON p.pil_pilot_id = s.dep_pilot_id
  INNER JOIN departures d ON p.pil_pilot_id = d.dep_pilot_id

По сути, кроме удаления соединения с equip_type, я добавил только одно соединение к подвыборке, который возвращает список dep_pilot_id значений, имеющих более одного отдельного dep_equip_no.

Если вы считаете, что в вашем запросе нужна таблица equip_type, вы можете вернуть удаленное объединение, это не должно повлиять на результаты.

0 голосов
/ 08 декабря 2011
select  pil_pilotname,dep_equip_no from pilots,departures,equip_type
where dep_pilot_id = pil_pilot_id  and eq_equip_no = dep_equip_no
group by pil_pilotname
having count(pil_pilotname) >1; 
0 голосов
/ 08 декабря 2011

Один из этих двух (или оба) должен работать

select distinct pil_pilotname, dep_equip_no, count(*) as c from pilots
join departures on dep_pilot_id = pil_pilot_id  
join equip_type on eq_equip_no = dep_equip_no
group by pil_pilotname
where c > 1
order by pil_pilotname;

Или

select distinct p1.pil_pilotname, p1.dep_equip_no from pilots p1
join departures d1 on d1.dep_pilot_id = p1.pil_pilot_id  
join equip_type e1 on e1.eq_equip_no = d1.dep_equip_no
where exists (
    select distinct p2.pil_pilotname from pilots p2
    join departures d2 on d2.dep_pilot_id = p2.pil_pilot_id  
    join equip_type e2 on e2.eq_equip_no = d2.dep_equip_no
    where p1.dep_equip_no != p2.dep_equip_no
)
order by p1.pil_pilotname;
0 голосов
/ 08 декабря 2011

Вы можете использовать предложение GROUP BY.

select distinct pil_pilotname,dep_equip_no, COUNT(*) AS FlightCount from pilots  join departures
on dep_pilot_id = pil_pilot_id  join equip_type
on eq_equip_no = dep_equip_no
group by pil_pilotname
having FlightCount > 1;
...