将 CTE 与查询的主要部分相关联,或者是否需要 CTE?

问题描述 投票:0回答:1

我一直在使用 CHAT GTP 创建我需要的查询。我们一起得到:

WITH employeeCompensation AS 
     (SELECT hourlyBonus, shiftBonus
      FROM empComp
      WHERE selfmanagerid = 1 AND
            employeeNumber = ER.employeeNumber AND
            effectiveDate >= WS.dateSoS
      FETCH FIRST ROW ONLY)        
SELECT ER.lastName, ER.firstName, ER.employeeNumber, hourlyBonus, shiftBonus
       EC.hourlyBonus, EC.shiftBonus,
       WS.dateSoS, EXTRACT (EPOCH FROM (WS.dateEoS + WS.timeEoS - WS.dateSoS - WS.timeSoS)) / 60 AS shiftDuration, 
       WS.wageType,
       H.holidate 
FROM workSchedules WS 
        INNER JOIN schedXEmp SXE ON SXE.schedId = WS.recId 
        INNER JOIN empRec ER ON ER.selfManagerId = 1 AND 
                   ER.employeeNumber = SXE.employeeNumber 
        LEFT JOIN lkupHolidays H ON (H.holidate = WS.dateSoS AND 
                                     H.deactivatedTs > H.holidate) 
WHERE WS.dateSoS BETWEEN '2020-4-15' AND '2020-10-15' AND 
      WS.deactivatedTs > CURRENT_TIMESTAMP AND 
      WS.selfmanagerid = 1 
ORDER BY ER.lastName, ER.firstName, WS.wageType, WS.dateSoS, WS.timeSoS
;

当然,这不起作用,因为 PostgreSQL 不喜欢在 CTE 中引用 ER 和 WS。它希望我将它们移至底部附近的 INNER JOIN。但是这样做不会在我的 CTE 中获得相同的记录集,因为它会获取任何员工和日期的第一个记录,然后尝试加入该记录。

有人有什么想法吗?

sql postgresql common-table-expression
1个回答
0
投票

PostgreSQL 不喜欢在 CTE 中引用 ER 和 WS

您误解了CTE的工作原理,CTE中的查询必须独立可执行,它不能引用不包含在其范围内的表。因此,您需要首先将这些联接包含在 CTE 中。

  • 您的 CTE 应该只返回 1 行,这样正确吗?
    SELECT hourlyBonus, shiftBonus
    FROM empComp
    WHERE selfmanagerid = 1 
      AND employeeNumber = ER.employeeNumber 
      AND effectiveDate >= WS.dateSoS
    FETCH FIRST ROW ONLY

因此我们需要加入 ER 和 WS,以便您可以使用它,但我没有足够的信息来为您做出此决定。

主要查询甚至没有使用您的 CTE,使得意图非常模糊。也许您不需要让 ChatGPT 为您生成神奇的 SQL,而是需要创建一个包含您原始查询或提示的新帖子。 SO 不是代码编写服务,但您可以询问有关技术的具体问题或让我们帮助您调试您尝试过的查询

© www.soinside.com 2019 - 2024. All rights reserved.