如何在不使用JOIN的情况下实现SQL连接?

gil*_*drv 11 sql join

如何在不使用JOIN关键字的情况下实现SQL连接?

这不是必要的,但我认为通过这样做我可以更好地理解联接实际上做了什么.

gil*_*drv 19

基本的INNER JOIN易于实现.下列:

SELECT L.XCol, R.YCol
FROM LeftTable AS L
INNER JOIN RightTable AS R
ON L.IDCol=R.IDCol;
Run Code Online (Sandbox Code Playgroud)

相当于:

SELECT L.XCol, R.YCol
FROM LeftTable AS L, RightTable AS R
WHERE L.IDCol=R.IDCol;
Run Code Online (Sandbox Code Playgroud)

为了将其扩展为LEFT/RIGHT/FULL OUTER JOIN,您只需要将没有匹配的行与正确列中的NULL一起UNION到先前的INNER JOIN.

对于LEFT OUTER JOIN,添加:

UNION ALL
SELECT L.XCol, NULL /* cast the NULL as needed */
FROM LeftTable AS L
WHERE NOT EXISTS (
    SELECT * FROM RightTable AS R
    WHERE L.IDCol=R.IDCol)
Run Code Online (Sandbox Code Playgroud)

对于RIGHT OUTER JOIN,添加:

UNION ALL
SELECT NULL, R.YCol /* cast the NULL as needed */
FROM RightTable AS R
WHERE NOT EXISTS (
    SELECT * FROM LeftTable AS L
    WHERE L.IDCol=R.IDCol)
Run Code Online (Sandbox Code Playgroud)

对于FULL OUTER JOIN,添加以上两者.


Pat*_*cci 5

这里一个较旧的过时的SQL语法,它允许你加入不使用JOIN关键字..但我个人觉得它比任何排列比较混乱JOIN我见过的运营商.这是一个例子:

SELECT A.CustomerName, B.Address1, B.City, B.State, B.Zip
FROM dbo.Customers A, dbo.Addresses B
WHERE A.CustomerId = B.CustomerId
Run Code Online (Sandbox Code Playgroud)

在旧方法中,您可以通过用逗号分隔表并在WHERE子句中指定JOIN条件来加入.就个人而言,我更喜欢JOIN语法:

SELECT A.CustomerName, B.Address1, B.City, B.State, B.Zip
FROM dbo.Customers A
JOIN dbo.Addresses B
ON A.CustomerId = B.CustomerId
Run Code Online (Sandbox Code Playgroud)

你应该回避这种旧式连接的原因是清晰度和可读性.当您只是将一个表连接到另一个表时,很容易弄清楚发生了什么.当您在六个(或更多)表中组合多种类型的连接时,这种较旧的语法变得非常难以管理.

获取JOIN运算符句柄的最佳方法是使用它.以下是不同JOIN所做的一个不错的视觉示例:

http://blog.codinghorror.com/a-visual-explanation-of-sql-joins/

更多信息:

https://sqlblog.org/2009/10/08/bad-habits-to-kick-using-old-style-joins

http://www.sqlservercentral.com/blogs/brian_kelley/2009/09/30/the-old-inner-join-syntax-vs-the-new-inner-join-syntax/