2017-05-09 104 views
1

我有以下查询SQL很难理解查询

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在此查询实际执行。我不确定是否有可能了解查询并为没有演示数据的人提供答案,但我目前没有演示数据。

+0

这里对于C.ID,C是指TABLEA数据。 – bigbounty

+0

我明白,但它是通过访问tableA的数据并将其等同于ID – Ahmad

回答

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 

子查询确保只有具有最大(日期)列,并键入HELLO将从行具有相同id来选择所以上述数据结果将返回:

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

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

+0

从逻辑上做到的。不,它不是主键。那么您的意思是子查询将针对基于WHERE条件的外部查询中选定的行运行? – Ahmad

+0

很酷。好的,用一个例子更新我的回应。希望有所帮助。 –

+0

谢谢 - 你知道任何资源,我可以阅读更多吗? – Ahmad