2015-11-19 79 views
0

我想实现一个内连接来比较两个表中的值,但是没有出于某种原因,并在查询返回零列。内连接有两个选择的sql

我有两个表的安全性和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

应尽量将包括对SQL问题'SqlServer','MySql' RDBMS的标签?某些功能不适用于所有数据库。 –

+0

查询看起来不错,可能你没有匹配的数据。检查内部选择的结果SELECT * FROM SECURITY_HIS t2 WHERE DATED =(' –

+0

它是sqlServer和我有匹配的数据!应该是有问题的查询 – user1200279

回答

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 
+0

返回0匹配:( – user1200279

+0

那么问题是你的数据,你可以准备SQL小提琴http://sqlfiddle.com/我吗? –

+0

我导出的数据,但由于某种原因,它给语法错误与出口 – user1200279

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 
+0

上MaxDated = MAX有语法错误(日期)ORA-00923:FROM关键字未找到预期 00923. 00000 - ? “从关键字找不到预期的地方” *原因: *动作: 行错误:7列:18 – user1200279

+0

@ user1200279:不要使用标签'SQL-server'如果你的引擎是Oracle。然后。我无法阅读您的想法或错误消息。 –