学习PL SQL,简单选择

时间:2016-11-24 20:45:11

标签: sql oracle

我在学习PL SQL而且遇到了障碍......

所以我有这个ER模型:enter image description here

我希望得到每个TipoAviao上拥有最多nHorasEfectuadas的Tripulante。 (每种飞机类型中具有最多小时数的机组人员的身份)。

我试过了:

SELECT T.IDTRIPULANTE, A.IDTIPOAVIAO, H.NHORASEFETUADAS
FROM TRIPULANTE T, HORASVOO H, TIPOAVIAO A
WHERE T.IDTRIPULANTE=H.IDTRIPULANTE 
and H.IDTIPOAVIAO=A.IDTIPOAVIAO 
and H.NHORASEFETUADAS = (select distinct max(o.NHORASEFETUADAS) 
FROM HORASVOO o 
WHERE o.IDTRIPULANTE = T.IDTRIPULANTE)
ORDER BY A.IDTIPOAVIAO;

但是它返回了所有的Tripulantes ......(只有10个)

enter image description here

我做错了什么?

谢谢!

3 个答案:

答案 0 :(得分:2)

您可以使用s4

ROW_NUMBER

解释

SELECT IDTIPOAVIAO, NHORASEFETUADAS, IDTRIPULANTE FROM ( SELECT A.IDTIPOAVIAO, H.NHORASEFETUADAS, T.IDTRIPULANTE, ROW_NUMBER() OVER (PARTITION BY A.IDTIPOAVIAO ORDER BY NHORASEFETUADAS DESC) RN FROM TIPOAVIAO A INNER JOIN HORASVOO H ON H.IDTIPOAVIAO=A.IDTIPOAVIAO INNER JOIN TRIPULANTE T ON T.IDTRIPULANTE=H.IDTRIPULANTE) X WHERE RN = 1 ORDER BY IDTIPOAVIAO; 取代了inner join子句中的内容,但这种方式确实很老套。 where是表达表格如何相互关联的ISO标准方式。

join是一个窗口函数,它为当前记录提供一个数字:它在row_number子句中定义的记录(分区)子部分中的序列号:具有相同IDTIPOAVIAO值的那些并且以降低NHORASEFETUADAS的顺序。这样你知道得到数字1的那个在该分区中具有最高的NHORASEFETUADAS。

答案 1 :(得分:1)

我希望我能正确理解你:

SELECT A.IDTIPOAVIAO, max(T.IDTRIPULANTE) keep (dense_rank first order by H.NHORASEFETUADAS desc)
FROM TRIPULANTE T join HORASVOO  H on T.IDTRIPULANTE=H.IDTRIPULANTE
                  join TIPOAVIAO A on H.IDTIPOAVIAO=A.IDTIPOAVIAO 
group by A.IDTIPOAVIAO

答案 2 :(得分:0)

IDTIPOAVIAONHORASEFETUADAS创建临时表或视图。尝试这样的事情:

CREATE TABLE TMP_ID AS
SELECT A.IDTIPOAVIAO AS ID,(SELECT MAX(H.NHORASEFETUADAS) FROM 
  HORASVOO H WHERE H.IDTIPOAVIAO=A.IDTIPOAVIAO) AS HIGHESTVALUE
FROM TIPOAVIAO A
GROUP BY A.IDTIPOAVIAO

SELECT H.IDTRIPULANTE, T.ID, T.HIGHESTVALUE
FROM HORASVOO H
INNER JOIN TMP_ID T ON (H.IDTIPOAVIAO=T.ID AND H.NHORASEFETUADAS=T.HIGHESTVALUE)