【问题标题】:How to write subquery inside the OUTER JOIN Statement如何在 OUTER JOIN 语句中编写子查询
【发布时间】:2012-05-16 15:15:19
【问题描述】:

我想加入两个表 CUSTMR 和 DEPRMNT。

我需要的是:LEFT OUTER JOIN OF LEFT OUTER JOIN 中包含子查询的两个或多个表,如下所示:

表:CUSTMR,DEPRMNT

查询为:

SELECT
    cs.CUSID
    ,dp.DEPID
FROM
    CUSTMR cs
        LEFT OUTER JOIN (
            SELECT
                    dp.DEPID
                    ,dp.DEPNAME
                FROM
                    DEPRMNT dp
                WHERE
                    dp.DEPADDRESS = 'TOKYO'
        )
            ON (
                dp.DEPID = cs.CUSID
                AND cs.CUSTNAME = dp.DEPNAME
            )
WHERE
    cs.CUSID != ''

这里的子查询是:

SELECT
    dp.DEPID, dp.DEPNAME
FROM
    DEPRMNT dp
WHERE
    dp.DEPADDRESS = 'TOKYO'

是否可以在 LEFT OUTER JOIN 中编写这样的子查询?

在我的 DB2 数据库上运行此查询时出现错误。

【问题讨论】:

  • 你应该总是发布你收到的错误信息。
  • 为什么标题说 INNER JOIN 而问题说 OUTER JOIN??...我正在编辑这个

标签: sql


【解决方案1】:

您需要子选择上的“相关 id”(“AS SS”事物)来引用“ON”条件下的字段。在子选择中分配的 id 在连接中不可用。

SELECT
       cs.CUSID
       ,dp.DEPID
FROM
    CUSTMR cs
        LEFT OUTER JOIN (
            SELECT
                    DEPID
                    ,DEPNAME
                FROM
                    DEPRMNT 
                WHERE
                    dp.DEPADDRESS = 'TOKYO'
        ) ss
            ON (
                ss.DEPID = cs.CUSID
                AND ss.DEPNAME = cs.CUSTNAME
            )
WHERE
    cs.CUSID != '' 

【讨论】:

  • 是的! “詹姆斯安德森”,非常感谢你。我的问题解决了。我发现我的问题是由于别名。 内部子查询应该总是有一个别名!
  • 这是一个相关的子查询,从而导致性能不佳吗?
  • “性能”完全取决于可用索引、可用内存、物理 dsik 分配、基数、您为软件支付了多少钱等等。拥有语法正确的 SQL 只是一个起点.
  • 性能并不取决于您为软件支付的费用。经典相关 => 因果关系。
【解决方案2】:

我认为在这种情况下您不必使用子查询。您可以直接左外连接 DEPRMNT 表。

在使用左外连接时,不要在where条件下使用连接的RHS表中的列,你会得到错误的输出

【讨论】:

  • 。其实在我的业务逻辑中,子查询是有group by的,当时我们需要写子查询!
猜你喜欢
  • 2014-07-14
  • 2013-03-14
  • 2014-01-07
  • 1970-01-01
  • 2017-01-16
  • 1970-01-01
  • 2015-01-10
  • 2018-04-04
  • 1970-01-01
相关资源
最近更新 更多