【发布时间】:2018-05-06 09:54:17
【问题描述】:
通常,当对两个表进行左连接时,左表(A)的所有行都被保留,而右表(B)仅在匹配连接条件时才被连接,例如A.ID = B.ID。 这适用于小型测试数据集。
但是,当我尝试将集合 A 与相当大的集合 B 连接时(即 B 中唯一 ID 的数量大约是 A 中唯一 ID 数量的 100 倍),结果数据集仅包含 A 的那些行具有与 B 匹配的 ID,在我的理解中,这是一个正常的(内部)连接。
我通过左连接集合 A 获得所需的结果表,其中仅包含集合 B 中与集合 A 具有匹配 ID 的行,但我不明白为什么简单的左连接不会产生相同的结果。
很遗憾,我无法使用测试数据复制结果。
一般来说,左连接后截断左表有可能的原因吗?
编辑:
A组:
ID name
X1 AB
X2 XY
X3 VT
X4 ZY
X5 YZ
X6 KJ
X7 HA
X8 BK
X9 LM
B组:
ID Var1
X1 blue
X11 red
X3 yellow
X4 blue
X12 yellow
X6 red
X7 orange
X7 blue
X8 green
X9 green
X10 blue
这给出了一个截断集 A:
select A.*, B.Var1 from
setA A
left join setB B
on A.ID = B.ID
where B.Var1 = 'blue';
这给了我想要的:
select A.*, B.Var1 from
setA A
left join (select * from setB where Var1 = 'blue') B
on A.ID = B.ID;
我现在明白 where 放置在 join 之后过滤连接结果,并且我需要将 join 和 where 视为两个单独的任务(对吗?)。
但是,对我(作为非专家)来说,B.Var1 = 'blue' 过滤连接结果似乎并不自然,尽管它说 B.Var1 而不仅仅是 Var1,我可以更容易理解以引用连接结果。 B. 建议(对我)以某种方式影响连接中使用的左表。
【问题讨论】:
-
Unfortunately, I cannon replicate the result with test data.我们也不行。 -
@Aki 。 . .毫无疑问,您有一个
where子句将外连接变为内连接。