使用任何连接结果都是一样的。为什么这样?

时间:2014-05-06 10:31:10

标签: sql-server sql-server-2008

我有两个表,AB

  • A,其中3行全1,1,1(单列)
  • B,其中2行全部为1 1,单列

我在这些表上使用了所有可用的连接o / p是相同的:

A   B
1   1
1   1
1   1
1   1
1   1
1   1

这些连接如何工作?

我在接受跨国公司采访时面对这些问题。

2 个答案:

答案 0 :(得分:1)

选中此项以了解不同类型的连接: http://blog.codinghorror.com/a-visual-explanation-of-sql-joins/

在您的情况下,结果与所有连接类型相同,因为您的值在所有表中都是相同的。

加入类型解释

FULL OUTER JOIN

从左(第一)和右(第二)表中选取所有记录,并在可用的情况下从两侧匹配记录。如果没有匹配,则缺少的一方将填充NULL。

LEFT OUTER JOIN

左连接从左(第一)表中选取所有记录,然后从右(第二)表传递所有匹配的记录。如果找不到匹配项,则右表的列将填充NULL

RIGHT OUTER JOIN

与左连接相同,只是订单已更改。

INNER JOIN

内连接选择连接条件为真的两个连接表中的所有记录。 (这是两组记录的交集)

CROSS JOIN

创建两个表中记录的所有组合。

** T-SQL(MSSQL)测试代码**

DECLARE @test1 TABLE (num INT, name VARCHAR(10))
DECLARE @test2 TABLE (num INT, value VARCHAR(10))

INSERT INTO @test1 (num, name) VALUES (1, 'first')
INSERT INTO @test1 (num, name) VALUES (2, 'second')
INSERT INTO @test1 (num, name) VALUES (3, 'third / 1')
INSERT INTO @test1 (num, name) VALUES (3, 'third / 2')

INSERT INTO @test2 (num, value) VALUES (1, 'one / 1')
INSERT INTO @test2 (num, value) VALUES (1, 'one / 2')
INSERT INTO @test2 (num, value) VALUES (3, 'three')
INSERT INTO @test2 (num, value) VALUES (4, 'four')


SELECT
    *
FROM
    @test1 T1
    FULL OUTER JOIN @test2 T2
        ON T1.num = T2.num

SELECT
    *
FROM
    @test1 T1
    LEFT JOIN @test2 T2
        ON T1.num = T2.num

SELECT
    *
FROM
    @test1 T1
    RIGHT JOIN @test2 T2
        ON T1.num = T2.num

SELECT
    *
FROM
    @test1 T1
    INNER JOIN @test2 T2
        ON T1.num = T2.num

SELECT
    *
FROM
    @test1 T1
    CROSS JOIN @test2 T2

答案 1 :(得分:0)

执行查询的过程按以下方式工作。

假设您有查询

select A.Id, B.Id 
From A
inner join B on A.Id = B.Id

Sql server引擎首先在A和B之间进行交叉连接,在虚拟表中创建所有记录(A行的B行)的列表。 然后它根据连接过滤记录。 与示例中一样,连接是内连接,条件是A.Id = B.Id. 在您的特定情况下,所有行都将满足连接条件,因此将返回所有记录。

现在,您可以对所有其他连接(左外连接,右外连接,全外连接,交叉连接)采用相同的方法。

在这种特定情况下,所有连接都将提供相同的输出。

检查网址:http://www.databaseskill.com/4841542/,详细了解查询的逻辑处理阶段。

此外,youtube上还有一个关于此的视频。您可以查看:https://www.youtube.com/watch?v=m1lIaTJ_oDM