【问题标题】:Joining two tables on a key and then left outer joining a table on a number of criteria在一个键上连接两个表,然后在多个条件上左外连接一个表
【发布时间】:2012-02-17 15:29:54
【问题描述】:

我正在尝试在一个查询中将 3 个表连接在一起。前两个有一个键,因此每个条目都有一个匹配的条目。然后,此连接表将由第三个表连接,该表可以为第一个表中的每个条目(连接的表)生成多个条目。

select * from
(select a.bidentifier, a.bsession, a.symbol, b.jidentifier, b.JSession 
from trade_monthly a, trade_monthly_second b 
where 
a.bidentifier = b.jidentifier AND  
a.bsession = b.JSession)
left outer join
trade c
on c.symbol = a.symbol
order by a.bidentifier, a.bsession, a.symbol, b.jidentifier, b.JSession, c.symbol

左外连接会有更多标准(不仅仅是 c.symbol = a.symbol),但现在这应该很有用。如何以这种方式嵌套查询?我刚开始遇到 gan SQL 命令未正确结束错误。 任何帮助表示赞赏。 谢谢

【问题讨论】:

  • Oracle 是否要求语句以分号结尾?

标签: sql oracle


【解决方案1】:

据我所知,每个派生表都必须命名;所以尝试这样的事情:

SELECT * FROM
    (SELECT a.bidentifier, ....
     ...
     a.bsession = b.JSession) t
LEFT JOIN trade c
    ON c.symbol = t.symbol
ORDER BY t.bidentifier, ...

无论如何,我认为您可以使用更简单的查询:

SELECT a.bidentifier, a.bsession, a.symbol, b.jidentifier, b.JSession, c.* 
FROM trade_monthly a 
INNER JOIN trade_monthly_second b
    ON a.bidentifier = b.jidentifier 
   AND a.bsession = b.JSession
LEFT JOIN trade c
    ON c.symbol = a.symbol
ORDER BY a.bidentifier, a.bsession, a.symbol, b.jidentifier, b.JSession, c.symbol

【讨论】:

  • @user1216565:看看我编辑的答案,让我知道它是否有效。
  • 每个派生表都必须有一个名字,有些类型的子查询不需要名字,但是如果你把它用作一个表,它必须有一个表名。
  • @HLGEM:感谢您的评论,这是正确的!我编辑了我的答案。再次感谢:)
  • hmm.. 我收到 SQL 命令未正确结束错误。 SQLState:42000 错误代码:933
  • 我在 SquirreL SQL Client 版本 3.3.0 一个 oracle 数据库中运行它。
【解决方案2】:

试试这个:

SELECT
   `trade_monthly`.`bidentifier` AS `bidentifier`,
   `trade_monthly`.`bsession` AS `bsession`,
   `trade_monthly`.`symbol` AS `symbol`,
   `trade_monthly_second`.`jidentifier` AS `jidentifier`,
   `trade_monthly_second`.`jsession` AS `jsession`
FROM
(
  (
     `trade_monthly`
     JOIN `trade_monthly_second` ON(
        (
           (
              `trade_monthly`.`bidentifier` = `trade_monthly_second`.`jidentifier`
           )
           AND(
              `trade_monthly`.`bsession` = `trade_monthly_second`.`jsession`
           )
        )
     )
  )
  JOIN `trade` ON(
     (
        `trade`.`symbol` = `trade_monthly`.`symbol`
     )
  )
 )
    ORDER BY
   `trade_monthly`.`bidentifier`,
   `trade_monthly`.`bsession`,
   `trade_monthly`.`symbol`,
   `trade_monthly_second`.`jidentifier`,
   `trade_monthly_second`.`jsession`,
   `trade`.`symbol`

【讨论】:

  • hmm.. 现在我只是得到一个表格或视图不存在的代码
  • 检查表名是否如您所说
【解决方案3】:

您为什么不直接为两个内部联接表创建一个视图。然后,您可以构建一个查询,使用 left outer join 匹配条件将此 view 连接到 trade 表。

在我看来,视图是许多复杂查询最容易被忽视的解决方案之一。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-13
    • 1970-01-01
    • 2021-09-25
    • 1970-01-01
    • 1970-01-01
    • 2012-07-28
    • 2018-05-11
    • 1970-01-01
    相关资源
    最近更新 更多