加入条件"ON"vs"WHERE"

use*_*468 2 sql join oracle11g

 SELECT *
 FROM Customers c
 INNER JOIN CustomerAccounts ca
 ON ca.CustomerID = c.CustomerID
 AND c.State = 'NY'
 INNER JOIN Accounts a
 ON ca.AccountID = a.AccountID
 AND a.Status = 1
Run Code Online (Sandbox Code Playgroud)

当量:

 SELECT *
 FROM Customers c
 INNER JOIN CustomerAccounts ca
 ON ca.CustomerID = c.CustomerID
 INNER JOIN Accounts a
 ON ca.AccountID = a.AccountID
 WHERE c.State = 'NY'
 AND a.Status = 1
Run Code Online (Sandbox Code Playgroud)

左加入:

 SELECT *
 FROM Customers c
 LEFT JOIN CustomerAccounts ca
 ON ca.CustomerID = c.CustomerID
 AND c.State = 'NY'
 LEFT JOIN Accounts a
 ON ca.AccountID = a.AccountID
 AND a.Status = 1
Run Code Online (Sandbox Code Playgroud)

当量:

 SELECT *
 FROM Customers c
 LEFT JOIN CustomerAccounts ca
 ON ca.CustomerID = c.CustomerID
 LEFT JOIN Accounts a
 ON ca.AccountID = a.AccountID
 WHERE c.State = 'NY'
 AND a.Status = 1
Run Code Online (Sandbox Code Playgroud)

正确加入

 SELECT *
 FROM Customers c
 RIGHT JOIN CustomerAccounts ca
 ON ca.CustomerID = c.CustomerID
 AND c.State = 'NY'
 RIGHT JOIN Accounts a
 ON ca.AccountID = a.AccountID
 AND a.Status = 1
Run Code Online (Sandbox Code Playgroud)

当量:

 SELECT *
 FROM Customers c
 RIGHT JOIN CustomerAccounts ca
 ON ca.CustomerID = c.CustomerID
 RIGHT JOIN Accounts a
 ON ca.AccountID = a.AccountID
 WHERE c.State = 'NY'
 AND a.Status = 1
Run Code Online (Sandbox Code Playgroud)

当我们在"WHERE"子句和"ON连接条件"中指定连接条件时,它有什么区别?

我们通过在"ON"子句和"WHERE"子句中指定连接条件,在内部,左外部,右外部连接中获得相同的结果.请指教.

Boh*_*ian 6

那么,你所谓的"等价"并不等同于外连接.我们以左连接为例.

加入条件:

SELECT * FROM Customers c
LEFT JOIN CustomerAccounts ca ON ca.CustomerID = c.CustomerID AND c.State = 'NY'
LEFT JOIN Accounts a ON ca.AccountID = a.AccountID AND a.Status = 1
Run Code Online (Sandbox Code Playgroud)

vs WHERE:

SELECT * FROM Customers c
LEFT JOIN CustomerAccounts ca ON ca.CustomerID = c.CustomerID
LEFT JOIN Accounts a ON ca.AccountID = a.AccountID
WHERE c.State = 'NY'
AND a.Status = 1
Run Code Online (Sandbox Code Playgroud)

将条件放入WHERE子句有效地使连接成为INNER连接,因为WHERE子句是在连接完成应用的行过滤器.