SQL在哪里有限制

时间:2011-12-08 06:11:08

标签: sql oracle sqlplus

下面是我的输出,我想只显示那些重复的名称。每个名字都是飞行员,号码是飞行员飞行的飞机类型。我想显示飞行多架飞机的飞行员的名字。我正在使用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 个答案:

答案 0 :(得分:2)

在这种情况下,最好的选择是使用分析

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;

答案 1 :(得分:0)

您可以使用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;

答案 2 :(得分:0)

这两个(或两个)中的一个应该起作用

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;

答案 3 :(得分:0)

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; 

答案 4 :(得分:0)

好像你没有从equip_type表中提取任何内容,在这种情况下你可能不需要加入它。我在此假设dep_equip_noequip_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的{​​{1}}值列表。

如果您认为查询中需要dep_equip_no表,则可以将删除的联接放回去,但不应影响结果。

答案 5 :(得分:0)

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;

这将为您提供所需。内部选择在哪里进行过滤。