SQL麻烦理解查询

时间:2017-05-09 00:02:39

标签: sql oracle plsql

我有以下查询

SELECT * FROM TABLEA C
WHERE C.VAL = 'SENIOR' 
AND C.TYPE = 'HELLO'
AND C.DATE = (SELECT MAX(DATE) from TABLEA WHERE TYPE = 
'HELLO'  AND C.ID=ID)

我无法理解内部查询中的C.ID = ID在此查询中实际执行的操作。我不确定是否可以理解没有演示数据的人的查询和答案,但我目前没有演示数据。

1 个答案:

答案 0 :(得分:1)

基本上,它确保子查询中的行仅匹配具有相同ID的外部查询中的行。但是,如果TABLEA.ID是主键,则子查询看起来有点多余。可能最好以一个例子来说明。假设ID不是主键,因此可以有多个具有相同ID的行:

ID        VAL       TYPE      DATE
1         SENIOR    HELLO     01-JAN-1970
1         SENIOR    HELLO     02-JAN-1970
1         JUNIOR    HELLO     03-JAN-1970
1         SENIOR    HELLO     03-JAN-1970
2         SENIOR    HELLO     04-JAN-1970
2         JUNIOR    HELLO     05-JAN-1970
2         SENIOR    HELLO     05-JAN-1970
2         JUNIOR    BYE       06-JAN-1970
3         JUNIOR    BYE       06-JAN-1970

子查询确保只从具有相同id的行中选择具有max(date)和type HELLO的行,以便返回上述数据的结果:

ID        VAL       TYPE      DATE
1         JUNIOR    HELLO     03-JAN-1970
2         JUNIOR    HELLO     05-JAN-1970

基本上,它只返回具有给定id的行的最新日期的行,该行也是HELLO和val SENIOR类型,只要具有最新日期的行也具有SENIOR的值。