postgresql CTE与查询的主要部分相关,还是甚至需要CTE?

dldeef67  于 2023-11-18  发布在  PostgreSQL
关注(0)|答案(1)|浏览(146)

我一直在使用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中获得相同的记录,因为它会获得任何雇员和日期的第一条记录,然后尝试加入那一条记录。
有人有什么想法吗?

rryofs0p

rryofs0p1#

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不是代码编写服务,但您可以询问有关技术的具体问题,或者让我们帮助您调试您尝试过的查询

相关问题