内连接有两个选择sql

时间:2015-11-19 23:57:48

标签: sql oracle join inner-join

我正在尝试实现内部联接以比较两个表的值,但是由于某种原因失败并且查询返回零列。

我有两个表security和security_his,并尝试在列SECURITY_ID和INVESTMENT_OBJECTIVE上加入它们。查询如下

SELECT *
FROM SECURITY origin
INNER JOIN (
    SELECT *
    FROM SECURITY_HIS t2
    WHERE DATED = (
            SELECT MAX(DATED)
            FROM SECURITY_HIS t1
            WHERE t1.SECURITY_ID = t2.SECURITY_ID
            )
    ) history ON origin.SECURITY_ID = history.SECURITY_ID
    AND origin.INVESTMENT_OBJECTIVE = history.INVESTMENT_OBJECTIVE;

2 个答案:

答案 0 :(得分:1)

WITH cte as (
    SELECT S.*,
           row_number() over 
               (partition by S.SECURITY_ID ORDER BY SH.DATED DESC)
    FROM SECURITY S
    JOIN SECURITY_HIS SH
      ON S.SECURITY_ID = SH.SECURITY_ID
     AND S.INVESTMENT_OBJECTIVE = SH.INVESTMENT_OBJECTIVE
)
SELECT *
FROM cte
WHERE rn = 1 

答案 1 :(得分:0)

最内层查询没有GROUP BY,因此只返回整个表上最大的单个值。但是,您的查询也可以简化以便于理解:

SELECT origin.*, history.Dated
FROM SECURITY origin
INNER JOIN (
    SELECT
        SECURITY_ID,
        INVESTMENT_OBJECTIVE,
        MaxDated = MAX(DATED)
    FROM SECURITY_HIS t2
    GROUP BY
        SECURITY_ID,
        INVESTMENT_OBJECTIVE
) history ON origin.SECURITY_ID          = history.SECURITY_ID
         AND origin.INVESTMENT_OBJECTIVE = history.INVESTMENT_OBJECTIVE