任何人都可以告诉我如何在不使用左连接的情况下编写左连接的等价物.
Select * from a left join b on a.name = b.name.
Run Code Online (Sandbox Code Playgroud)
one*_*hen 10
请记住,SQL的外连接是一种关系联合,它专门设计用于投影空值.如果你想避免使用null值(在我看来是一件好事),你应该避免使用外连接.请注意,现代关系语言完全没有使用null和outer连接的概念.
这个外连接:
SELECT DISTINCT T1.id, T1.value, T2.other_value
FROM T1
LEFT OUTER JOIN T2
ON T1.id = T2.id;
Run Code Online (Sandbox Code Playgroud)
...在语义上等同于此SQL代码:
SELECT T1.id, T1.value, T2.other_value
FROM T1
INNER JOIN T2
ON T1.id = T2.id
UNION
SELECT T1.id, T1.value, NULL
FROM T1
WHERE NOT EXISTS (
SELECT *
FROM T2
WHERE T1.id = T2.id
);
Run Code Online (Sandbox Code Playgroud)
第二个查询可能看起来很长,但这只是因为SQL的设计/演变方式.以上只是一个自然的联合,一个联盟和一个半联盟.但是,SQL没有semijoin运算符,要求您在SELECT子句中指定列列表,JOIN如果您的产品没有实现标准SQL的NATURAL JOIN语法,则需要编写子句,这会导致很多代码表达非常简单的内容.
因此,您可以编写代码,例如上面的第二个查询,但使用实际的默认值而不是null值.
Oracle伪装左连接:
SELECT * FROM A, B
WHERE a.name = b.name(+)
Run Code Online (Sandbox Code Playgroud)
通用的 :
SELECT a.*, case c.existence WHEN 1 then c.name ELSE NULL END
FROM A
INNER JOIN ( SELECT name name, 1 existence FROM B
UNION ALL
SELECT a.name name, 0 existence FROM A
WHERE a.name NOT IN ( SELECT name FROM B )
) C
ON c.name = a.name
Run Code Online (Sandbox Code Playgroud)