anb*_*sme 3 sql oracle correlated-subquery
我有一个看起来像这样的查询:
SELECT 'FY2000' AS FY, COUNT(DISTINCT SGBSTDN_PIDM) AS CHEM_MAJORS
FROM SATURN.SGBSTDN, SATURN.SFRSTCR
WHERE SGBSTDN_PIDM = SFRSTCR_PIDM
AND SGBSTDN_TERM_CODE_EFF = (SELECT MAX(SGBSTDN_TERM_CODE_EFF)
FROM SATURN.SGBSTDN
WHERE SGBSTDN_TERM_CODE_EFF <= '200002'
AND SGBSTDN_PIDM = SFRSTCR_PIDM)
AND SGBSTDN_MAJR_CODE_1 = 'CHEM'
AND SFRSTCR_TERM_CODE BETWEEN '199905' AND '200002'
AND (SFRSTCR_RSTS_CODE LIKE 'R%' OR SFRSTCR_RSTS_CODE LIKE 'W%')
AND SFRSTCR_CREDIT_HR >= 1
Run Code Online (Sandbox Code Playgroud)
它返回48的计数,我认为是正确的.但是,我不明白为什么SATURN.SFRSTCR子句在FROM子句中不需要引用SFRSTCR_PIDM.我认为子查询是自包含的,无法看到查询的其余部分?
但是,如果我将SATURN.SFRSTCR添加到子查询中,则计数更改为22.如果我取出AND SGBSTDN_PIDM = SFRSTCR_PIDM子查询,计数也会更改为22.有人可以向我解释这个吗?
您有一个相关的子查询.这与非相关子查询略有不同,因为它可以包含对外部表的引用.
使用相关子查询时,请始终对所有表引用使用表别名.一般来说这是个好主意,但应该更加注意相关的子查询.
AND SGBSTDN_TERM_CODE_EFF = (SELECT MAX(SGBSTDN.SGBSTDN_TERM_CODE_EFF)
FROM SATURN.SGBSTDN
WHERE SGBSTDN.SGBSTDN_TERM_CODE_EFF <= '200002'
AND SGBSTDN.SGBSTDN_PIDM = SFRSTCR.SFRSTCR_PIDM
)
Run Code Online (Sandbox Code Playgroud)
对于SFRSTCR.SFRSTCR_PIDM(和其他条件)的每个值,子查询获取最大日期.
在SQL的大多数版本,相关子查询被允许在from,where和having条款.(他们也可能被允许进入order by.)