【问题标题】:Why are there duplicates created with full outer join with more than 3 tables?为什么使用超过 3 个表的完全外连接创建重复项?
【发布时间】:2016-03-19 10:48:06
【问题描述】:

当第一个表(FROM 表)没有至少两个其他表具有的键值时,为什么总是使用 T-SQL FULL OUTER JOIN 创建具有超过 2 个表的重复项?

create table x(a int)
create table y(a int)
create table z(a int)

INSERT INTO x values (0);
INSERT INTO y values (1);
INSERT INTO z values (1);

SELECT x_a=x.a, y_a=y.a, z_a=z.a, a=coalesce(x.a,y.a,z.a)
FROM x as x
FULL JOIN y as y
ON y.a=x.a
FULL JOIN z as z
ON z.a=x.a
ORDER BY a

产量:

x_a        y_a    z_a   a
0          NULL   NULL  0
NULL        1     NULL  1
NULL       NULL    1    1

因此,我们有重复的键值,这不是我所期望的,或者如果您按顺序或按两个顺序加入表会得到什么。在这种情况下,FULL JOIN 并不是真正的关联或交流。

有没有办法以编程高效的方式解决这个问题?

【问题讨论】:

  • 我不明白你的问题:/
  • 那么您的预期结果是什么?

标签: sql sql-server join


【解决方案1】:

让我们看看。如果你运行:

SELECT x_a = x.a, y_a = y.a, a=coalesce(x.a, y.a)
FROM x as x FULL JOIN
     y as y
     ON y.a = x.a;

您将获得两行,因为y.a 不等于x.a 并且FULL JOIN 保留两个表中的所有行,即使没有匹配。不匹配表中的列都是NULL

行将是:

x_a    y_a    a
0      NULL   0
NULL   1      1

ON 条件对于FULL JOIN 为假时,就会发生这种情况。

当使用z 重复此操作时,您会得到三行,因为ON 条件也是错误的。

结果对我来说非常有意义。

【讨论】:

  • 你能准确地告诉我你所说的“当这与 z 重复时”是什么意思?如果您首先连接 x 和 y,然后将结果与 z 完全连接,您将在最终输出中得到两行。

    如果您将两个单独的步骤结合起来,您当然会得到 4 行。

    我真的不知道 SQL 在这里做什么。
  • @JohnSmith 。 . .如果您使用 full join 并且条件评估为 false 或 NULL,那么您将从 both 表中获取行。
猜你喜欢
  • 2014-08-07
  • 2017-06-10
  • 2018-05-24
  • 2014-08-21
  • 1970-01-01
  • 2011-12-26
  • 1970-01-01
  • 2022-01-02
  • 2018-04-16
相关资源
最近更新 更多