Pet*_*aut 16 oracle join syntax
我在应该从 Oracle 外连接语法移植到 SQL 标准外连接语法的查询中看到了以下内容:
SELECT ...
FROM A, B, C, D, E
WHERE A.A_ID = B.A_ID
AND B.B_ID = C.A_ID(+)
AND B.B_KEY = C.B_KEY(+)
AND C.C_ID = D.C_ID(+)
AND B.A_ID = E.A_ID(+)
AND B.B_KEY = E.B_KEY(+)
AND 'CONSTANT' = C.X_ID(+)
Run Code Online (Sandbox Code Playgroud)
现在翻译外连接语法通常是一个非常机械的过程,但最后一行让我感到困惑。这是什么意思?它有什么作用?
ber*_*d_k 11
我试图执行机械过程。我希望我没记错。
这将导致:
SELECT ...
FROM A
join B on A.A_ID = B.A_ID
left join C on B.B_ID = C.A_ID and B.B_KEY = C.B_KEY and 'CONSTANT' = C.X_ID
left join D on C.C_ID = D.C_ID
left join E on B.A_ID = E.A_ID and B.B_KEY = E.B_KEY
Run Code Online (Sandbox Code Playgroud)
简而言之,我认为 Leigh Riffel 的回答是正确的。
笔记
在过去,要记住的规则是:oracle where Aa = Bb (+) 变成 Aa *= Bb 在 SQL-Server 旧语法中,加号转到相反的一侧并变成星号,这意味着 A left join B on Aa = Bb
Lei*_*fel 10
该行要求 c.X_ID 等于常量值或 C 表中没有记录。当然,由于是左连接,它不会限制A表中的记录,只限制C表中连接的记录。这是一个演示:
设置:
CREATE TABLE T1 as (select rownum+1 t1_id from dual connect by rownum <= 4);
CREATE TABLE T2 as (
select rownum t1_id, DECODE(rownum,2,'CONSTANT',3,'NoMatch') CompareField
from dual connect by rownum <= 3
);
SELECT * FROM T1;
SELECT * FROM T2;
Run Code Online (Sandbox Code Playgroud)
结果:
SELECT T1.t1_id, T2.t1_id, T2.CompareField
FROM T1, T2
WHERE T1.t1_id = T2.t1_id(+)
AND 'CONSTANT' = T2.CompareField(+)
ORDER BY 1;
Run Code Online (Sandbox Code Playgroud)
或者:
SELECT T1.t1_id, T2.t1_id, T2.CompareField
FROM T1 LEFT JOIN T2 ON T1.t1_id = T2.t1_id
AND 'CONSTANT' = T2.CompareField
ORDER BY 1;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1277 次 |
| 最近记录: |