繁体   English   中英

SQL查询有关外部联接的帮助

[英]SQL query help with outer joins

我有3张桌子。 我正在使用Oracle 10g。

我试图从表A中获取记录,其中表C中不存在行,并且如果表C中存在对应的行,那么它应该满足C_PRIAMRY = 1的条件。

Table_A

A_ID, A_NAME, A_STATUS_CD, A_STATUS_DTE
----------------------------------------
1      test1       NM        
2      test2       BB
3      test3       CC

Table_B

B_ID     B_START_DATETIME     B_END_DATETIME
--------------------------------------------
10         07-10-2010          08-10-2010
20         07-10-2010          08-10-2010


Table_C

C_ID   A_ID   B_ID       C_PRIMARY
-------------------------------------
1       1       10          1
2       1       10          0
3       1       10          0



select A.A_ID, A.A_NAME, A.A_STATUS_CD, A.A_STATUS_DTE, B.B_ID, B.B_START_DATETIME, C.C_PRIMARY
   FROM TableA A, TableB B, TABLEC C
WHERE A.A_ID = C.A_ID (+) AND C.B_ID = B.B_ID(+) AND C.PRIMARY(+) = 1        

我写了这个查询,它不起作用。 请提出任何想法。

谢谢

考虑从(+)重写:

select * from A, B where A.ID = B.A_ID(+)

等效的,更容易理解的left join

select * from A left join B on A.ID = B.A_ID

将其应用于您的查询,我得到:

select  *
from    TableA A
left join
        TableC C
on      c.a_id = a.a_id
        and C.PRIMARY = 1
left join
        TableB B
on      b.b_id = c.b_id

这应该从A检索所有行,并与C的行匹配,其中primary = 1 ,与B的行匹配。

要在找不到匹配项时从结果中排除行,请使用一个inner join 例如,要查找A中的行,而C中存在对应的行且其中primary = 1 ,而B中没有对应的行:

select  *
from    TableA A
inner join
        TableC C
on      C.A_ID = A.A_ID
        and C.C_PRIMARY = 1
where   not exists
        (
        select  *
        from    TableB B
        where   C.B_ID = B.B_ID
        )

尝试这个:

SELECT A.A_ID, A.A_NAME, a.A_STATUS_CD, A.A_STATUS_DTE,
   B.B_ID, B.B_START_DATETIME, C.C_PRIMARY
FROM TableA A LEFT JOIN TableC C ON A.A_ID = C.A_ID
   LEFT JOIN TAbleB B ON B.B_ID = C.B_ID
WHERE C.A_ID IS NULL OR C.PRIMARY = 1

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM