gpt4 book ai didi

sql - 子查询中的意外行为

转载 作者:行者123 更新时间:2023-12-04 18:24:32 24 4
gpt4 key购买 nike

我的查询如下所示:

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

它返回的计数是 48,我认为这是正确的。但是,我不明白为什么子查询不需要 FROM 子句中的 SATURN.SFRSTCR 来引用 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
)

对于 SFRSTCR.SFRSTCR_PIDM 的每个值(以及其他条件),子查询获取最大日期。

在大多数 SQL 版本中,fromwherehaving 子句中允许关联子查询。 (它们也可能按 order by 被允许。)

关于sql - 子查询中的意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18082060/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com