我有一个样本表,加入时打错了字。但这会产生一些我无法理解的结果。您能用简单的英文解释为什么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
我期待以下结果,因为我要加入不同的行:
但是,我得到的是:
最佳答案
OP指出该错误是已知的并已纠正,问题是为什么当错误出现时会返回三个重复项。
答案是,因为JOIN
子句不是将temp
表的两个实例进行比较,而是将第一个实例与其自身进行比较,所以该查询将tfo
中的每一行与t
中的每一行进行了匹配。由于表中有三行,因此每行返回三行。在表中添加另一行,您将看到每个原始行都有四个重复项。
对此进行扩展:您将temp作为两个别名加入:t
和tfo
。 SELECT
查看t
中的每一行,然后将其与tfo
中的每一行进行比较,以查看JOIN
条件是否与t
中的行和tfo
中的行相匹配。但是,由于您的错误将t
中的行与其自身匹配,因此对于tfo
中的每一行,JOIN
为true,因此每行重复的次数与tfo
中的行的次数相同。由于它是同一张表,因此您获得的重复数与表中的行数相同,因此结果集将包含表中行数的平方。