如何在不使用JOIN关键字的情况下实现SQL连接?
这不是必要的,但我认为通过这样做,我可以更好地了解联接实际上做了什么。
答案 0 :(得分:15)
基本的INNER JOIN易于实现。 以下内容:
SELECT L.XCol, R.YCol
FROM LeftTable AS L
INNER JOIN RightTable AS R
ON L.IDCol=R.IDCol;
相当于:
SELECT L.XCol, R.YCol
FROM LeftTable AS L, RightTable AS R
WHERE L.IDCol=R.IDCol;
为了将其扩展为LEFT / RIGHT / FULL OUTER JOIN,您只需将没有匹配的行以及正确列中的NULL加入到先前的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)
对于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)
对于FULL OUTER JOIN,添加上述两个。
答案 1 :(得分: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
在旧方法中,您可以通过用逗号分隔表并在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
你应该回避这种旧式联接的原因是清晰度和可读性。当您只是将一个表连接到另一个表时,很容易弄清楚发生了什么。当您在六个(或更多)表中组合多种类型的连接时,这种较旧的语法变得非常难以管理。
获取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
答案 2 :(得分:1)
当SQL是婴儿时,我们没有"内部联接" "左外连接"我们所做的就是列出这样的表格:
FROM table1, table2, table3, .... tablen
然后我们有一个where子句,就像一个小说的长度,一些条件是用于过滤数据,许多条件是连接表,像这样
FROM table1, table2, table2, .... tablen
WHERE table1.code = 'x' and table1.id - table3.fk and table2.name like 'a%' and table2.id = table1.fk and tablen.fk = table3.id and table2.dt >= '2014-01-01'
从这一点开始,我们希望我们把所有桌子都很好地关联起来,然后我们交叉了手指。最糟糕的情况 - 发生了很多 - 是我们忘了在where子句中包含一个表。这并不好,因为当我们这样做时,我们得到的是笛卡尔产品" (基本上所有行乘以我们错过的表中的行数。)
然后是ANSI标准连接语法,生活更好。我们现在将连接条件放在连接上 - 而不是在where子句中 - 并且作为奖励,where子句更容易理解。
我不认为你会发现理解这种古老的语法更容易,例如外连接是join = bizarre(+)或者它可能是(+)奇异=加入(我尽量不记得)
尝试http://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins