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

Lea*_*ner 3 sql t-sql sql-server

我有一个样本表,加入时打错了字。但这会产生一些我无法理解的结果。您能用简单的英文解释为什么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
Run Code Online (Sandbox Code Playgroud)

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

请不要关闭我的问题

样本数据:

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)
Run Code Online (Sandbox Code Playgroud)

而我的查询:

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
Run Code Online (Sandbox Code Playgroud)

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

在此处输入图片说明

但是,我得到的是:

在此处输入图片说明

Luk*_*zda 5

您需要更改表别名,因为对于不可为空的列t.id_StationDeparture = t.id_StationDeparture,您的条件始终为true,并且工作方式与CROSS JOIN

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 = 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;
Run Code Online (Sandbox Code Playgroud)

db <> fiddle演示


编辑:

结果集有9行,因为CROSS JOIN它是笛卡尔积,并且3乘以3等于9

集合的基数是集合中元素的数量。输出集的基数等于所有输入集的基数的乘积

| A×B | = | A | ·| B |

  • @Learner请刷新页面,然后阅读有关笛卡尔乘积的数学概念CROSS JOIN和集合论中的基数的信息。一切都已经提供 (2认同)