Sql 如何在外部联接语句中写入子查询

Sql 如何在外部联接语句中写入子查询,sql,Sql,我想加入两个表CUSTMR和DEPRMNT 我需要的是:两个或多个表的左外部联接,其子查询位于左外部联接内,如下所示: 表:CUSTMR,DEPRMNT 查询方式: SELECT cs.CUSID ,dp.DEPID FROM CUSTMR cs LEFT OUTER JOIN ( SELECT dp.DEPID ,dp.DEPNAME

我想加入两个表CUSTMR和DEPRMNT

我需要的是:两个或多个表的左外部联接,其子查询位于左外部联接内,如下所示:

表: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'
是否可以在左外联接内部编写这样的子查询

在DB2数据库上运行此查询时,我遇到一个错误。

您需要子选择上的“correlation id”(AS SS“thingy)来引用“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 != '' 

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


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

您应该始终发布收到的错误消息。为什么标题说是“内部联接”,而问题说是“外部联接”??。。。我正在编辑这个是的!“詹姆斯·安德森”,非常感谢你。我的问题解决了。我发现我的问题是由于别名。内部子查询应始终具有别名!这是一个相关的子查询,因此性能很差吗?“性能”完全取决于可用索引、可用内存、物理dsik分配、基数、您为软件支付的费用等。。拥有语法正确的SQL只是一个起点。性能并不取决于您为软件支付的费用。经典关联=>因果关系..实际上在我的业务逻辑中,子查询使用了group by,当时我们需要编写子查询!