我有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
我写了这个查询它不起作用。请提出任何想法。
谢谢
答案 0 :(得分:3)
考虑从(+)
重写:
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
)
答案 1 :(得分:3)
试试这个:
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