SQL where限制

SQL where限制,sql,oracle,sqlplus,Sql,Oracle,Sqlplus,下面是我的输出,我只想显示那些重复的名称。每个名字都是一名飞行员,编号是飞行员驾驶的飞机类型。我想显示驾驶多架飞机的飞行员的姓名。我正在使用sql*plus PIL_PILOTNAME DEP_EQUIP_NO ------------------------------ ------------ Gladchuk, Chet 1085 Gladchuk, Chet 1345 Green, Ed

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

您可以使用
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;
这两种方法中的一种(或两者)应该都能起作用

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;


似乎您没有从
equipment\u type
表中提取任何内容,在这种情况下,您可能不需要加入它。这里我假设
dep\u-equipment\u-no
eq\u-equipment\u-no
类型的外键,因此无法保存
equipment\u-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
基本上,除了删除对
dep\u-type
的连接外,我只在返回一个
dep\u-pilot\u-id
值列表的子选择中添加了一个连接,该值具有多个不同的关联
dep\u-equipmu-no


如果您认为在查询中需要
equipment\u type
表,您可以将删除的联接放回原处,它不会影响结果。

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

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;

这会给你你所需要的。在何处进行过滤的内部选择。

注意,您还需要检查重复的数量-为您查找一些文档。无法选择pil_pilotname,dep_Equipmno,当仅在pil_pilotname上分组时,我在发布答案时没有看到Oracle-很好。无法选择pil_pilotname,当仅在pil_pilotnameI上分组时,dep_Equipmno试图回答您关于显示飞行员最高工资(8451995)的问题,但现在似乎已被删除。很抱歉
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
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;
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;