我有一个样本表,加入时打错了字。但这会产生一些我无法理解的结果。您能用简单的英文解释为什么SQL会乘行吗?

我知道如何解决问题:

INNER JOIN @temp tfo
ON t.id_StationDeparture = tfo.id_StationDeparture
    AND t.id_StationDestination = tfo.id_StationDestination
    AND t.id_City = tfo.id_City
    AND t.id_District = tfo.id_District
    AND t.id_Street = tfo.id_Street
    AND t.Amount = tfo.Amount


但是,我真的很想知道为什么会这样。

拜托,不要回答我的问题

样本数据:

DECLARE @temp TABLE
(
    id_StationDeparture INT,
    id_StationDestination INT,
    id_City INT,
    id_District INT,
    id_Street INT,
    Amount DECIMAL(15, 2)
)

INSERT INTO @temp
(
    id_StationDeparture,
    id_StationDestination,
    id_City,
    id_District,
    id_Street,
    Amount
)
VALUES  ( 10, 11, 1, 1, 1, 0)
, ( 12, 14, 1, 1, 0,0)
, ( 16, 18, 1, 1, 0,0)


而我的查询:

SELECT
  t.id_StationDeparture
, t.id_StationDestination
, t.id_City
, t.id_District
, t.id_Street
, t.Amount
FROM @temp  t
INNER JOIN @temp tfo
ON t.id_StationDeparture = t.id_StationDeparture
    AND t.id_StationDestination = t.id_StationDestination
    AND t.id_City = t.id_City
    AND t.id_District = t.id_District
    AND t.id_Street = t.id_Street
    AND t.Amount = t.Amount


我期待以下结果,因为我要加入不同的行:

sql - 如果我自己联接,为什么INNER JOIN将所有行相乘?-LMLPHP

但是,我得到的是:

sql - 如果我自己联接,为什么INNER JOIN将所有行相乘?-LMLPHP

最佳答案

OP指出该错误是已知的并已纠正,问题是为什么当错误出现时会返回三个重复项。

答案是,因为JOIN子句不是将temp表的两个实例进行比较,而是将第一个实例与其自身进行比较,所以该查询将tfo中的每一行与t中的每一行进行了匹配。由于表中有三行,因此每行返回三行。在表中添加另一行,您将看到每个原始行都有四个重复项。

对此进行扩展:您将temp作为两个别名加入:ttfoSELECT查看t中的每一行,然后将其与tfo中的每一行进行比较,以查看JOIN条件是否与t中的行和tfo中的行相匹配。但是,由于您的错误将t中的行与其自身匹配,因此对于tfo中的每一行,JOIN为true,因此每行重复的次数与tfo中的行的次数相同。由于它是同一张表,因此您获得的重复数与表中的行数相同,因此结果集将包含表中行数的平方。

10-05 23:07