【问题标题】:inner join with two selects sql带有两个选择 sql 的内连接
【发布时间】:2015-11-19 23:57:47
【问题描述】:

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

我有两个表 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;

【问题讨论】:

  • 总是尝试在你的 rdbms 标签中包含 sql 问题 SqlServer, MySql?。某些功能并非在所有数据库上都可用。
  • 查询看起来没问题,可能你没有匹配的数据。检查内部选择SELECT * FROM SECURITY_HIS t2 WHERE DATED = (的结果
  • 它是 sqlServer,我有匹配的数据!查询应该有问题
  • 向我们展示架构和示例数据或准备一个 sqlFiddle sqlfiddle.com/#!6/860c2
  • @JuanCarlosOropeza 添加了架构

标签: sql oracle join inner-join


【解决方案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 

【讨论】:

  • 那问题出在你的数据上,能不能帮我准备一下sql fiddlesqlfiddle.com
  • 我导出了数据,但由于某种原因,导出时出现语法错误
  • 我知道我尝试加载但没有工作,你确定是 SQL Server 吗?在 sql fiddle 中是一个函数 Text to DDL 你只需复制带有字段名的数据,他就会为你创建表。
  • 我没有看到字段 DATEDINVESTMENT_OBJECTIVE
  • 仍然没有完成只有一张表而不是数据:(
【解决方案2】:

您在最里面的查询中没有 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

【讨论】:

  • 在 MaxDated = MAX(DATED) 上出现语法错误 ORA-00923:在预期 00923 处未找到 FROM 关键字。00000 - “在预期位置未找到 FROM 关键字” *原因:*操作:行错误: 7 列:18
  • @user1200279:如果您的引擎是 Oracle,请不要使用标签 sql-server。然后。我无法读懂你的想法或你的错误信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-04
相关资源
最近更新 更多