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

时间:2014-08-06 13:31:26

标签: sql join

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

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

3 个答案:

答案 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

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

答案 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