SQL:可以将任何类型的连接重写为一组WHERE条件吗?

1 sql database join where-clause

例:

如果我有一张桌子和他们的主人.

我可以做任何一个或者为自然连接获得相同的结果:

SELECT * FROM owners, things WHERE owners.id = things.owner_id
SELECT * FROM owners JOIN things ON owners.id = things.owner_id
Run Code Online (Sandbox Code Playgroud)

现在,如果我想做左联?像这样,所有业主都归还...

SELECT * FROM owners LEFT JOIN things ON owners.id = things.owner_id
Run Code Online (Sandbox Code Playgroud)

是否可以将任何类型的连接重写为一组WHERE条件?

谢谢

Qua*_*noi 6

一个INNER JOIN为隐式连接可以随时改写.

一个OUTER JOIN有时可以通过专有条款行重写(+)Oracle,*SQL Server等,但并非总是如此.

另外,OUTER JOIN可以使用UNION ALL和子查询重写:

SELECT  *
FROM    a
FULL JOIN
        b
ON      some_condition(a, b)
Run Code Online (Sandbox Code Playgroud)

是相同的

SELECT  *
FROM    a, b
WHERE   some_condition(a, b)
UNION ALL
SELECT  a.*, NULL, NULL, …, NULL
FROM    a
WHERE   NOT EXISTS
        (
        SELECT  NULL
        FROM    b
        WHERE   some_condition(a, b)
        )
UNION ALL
SELECT  NULL, NULL, …, NULL, b.*
FROM    b
WHERE   NOT EXISTS
        (
        SELECT  NULL
        FROM    a
        WHERE   some_condition(a, b)
        )
Run Code Online (Sandbox Code Playgroud)

这曾经是一个解决办法OraclePostgreSQL它不支持ANSI的语法在早期版本中,也是一种解决办法是MySQL不支持FULL JOIN

ANSI OUTER JOIN如果数据库支持语法,则应使用语法.