使用包含GROUP BY子句的表联接重写查询

时间:2019-03-22 04:49:34

标签: oracle peoplesoft

是否可以重写以下查询

SELECT      CT.GROUP, CT.EMP_ID, HT.EFF_DT
FROM        CURR_TABLE CT
JOIN        (SELECT     GROUP, EMP_ID, MAX(EFF_DT) AS EFF_DT
            FROM        HIST_TABLE
            WHERE       STAT = 'A' 
            GROUP BY    GROUP, EMP_ID) HT ON CT.GROUP = HT.GROUP AND 
            CT.EMPID = HT.EMP_ID
WHERE       CT.GROUP = :1
AND         CT.EMP_ID = :2

是否以类似于CROSS JOIN风格的方式出现?

SELECT table1.column1, table2.column2...
FROM  table1, table2 [, table3 ]

原因是我想在Peoplesoft中创建这样的查询,而以上内容只能通过使用group by子句为选择创建单独的视图来实现。我只想在一个查询中执行此操作,而无需创建其他视图。

1 个答案:

答案 0 :(得分:1)

您可以尝试将查询编写为具有聚合的单级联接:

SELECT
    CT.GROUP,
    CT.EMP_ID,
    MAX(HT.EFF_DT) AS EFF_DT
FROM CURR_TABLE CT
LEFT JOIN HIST_TABLE HT
    ON CT.GROUP = HT.GROUP AND
       CT.EMPID = HT.EMP_ID AND
       HT.STAT = 'A'
WHERE
    CT.GROUP = :1 AND
    CT.EMP_ID = :2
GROUP BY
    CT.GROUP,
    CT.EMP_ID;

请注意,GROUP是保留的SQL关键字,您可能必须用双引号将其转义才能使此查询(或您所质疑的查询)在Oracle上运行。