SQL左连接和手动空添加

SQL左连接和手动空添加,sql,Sql,我有表(列)A(A)和B(B,A)。 字段a在a中是主字段,b在b中是主字段A表示一组类,B表示一组元素,每个元素都是一个类的一部分。 任务是在第一列检索所有类(A.A),在第二列检索这些类的元素。若某个类不包含元素,则应在第二列中使用null检索该类 右查询是: select A.a, B.b from A left join B on A.a = B.a 这正是我需要的。但是,在阅读了left join的文档之后,我尝试使用query手动重复此结果: select B.a, B.b as

我有表(列)
A(A)
B(B,A)
。 字段
a
a
中是主字段,
b
b
中是主字段
A
表示一组类,
B
表示一组元素,每个元素都是一个类的一部分。 任务是在第一列检索所有类(
A.A
),在第二列检索这些类的元素。若某个类不包含元素,则应在第二列中使用null检索该类

右查询是:

select A.a, B.b from A left join B on A.a = B.a
这正是我需要的。但是,在阅读了left join的文档之后,我尝试使用query手动重复此结果:

select B.a, B.b as "b" from B
union
select A.a, null as "b" from A
where A.a not in (select B.a from B)
第一行选择我需要的所有对,第三行到第四行专门选择表
B
中未显示的类,第二列为null。 这两个查询返回的行数不同,我不明白为什么。谁能给我解释一下吗?这是因为我对加入左派行为的理解还是其他原因?
(不幸的是,我没有太多的权限访问在其上执行此操作的服务器,我可能只看到返回的行数。)

Union将所有空值视为单个空值,这可能不是您所期望的。有两种解决方法:

1. Use UNION ALL
2. Use non distinct "type Fields"...


    SELECT
          Type="Type1",
          Amount
       FROM 
         Table

       UNION

       SELECT
          Type="Type2",
          Amount
       FROM 
          Table

假设您有如下数据:

Table A
1
2
3
4

Table B
1, A
1, B
2, A
3, F
3, F
联合
将消除出现的任何重复结果。在这种情况下,“3,F”只列出一次。否则,结果将是相同的。
UNION ALL
应返回相同的精确结果

请参见此内容(注意:此内容最初是作为评论发布的。)

如果
B.a
可以有空值,并且该列中的某些行确实有空值,则第二个查询的第二部分将不返回任何内容。这是因为
x不在(列表)
本质上转换为

 x <> value1 AND x <> value2 AND ...
x值1和x值2以及。。。
当至少一个值为NULL时,该特定的
谓词的计算结果为未知,如果所有其他谓词的计算结果均为TRUE,则整个条件也将变为未知(根据上下文,TRUE和UNKNOWN产生UNKNOWN)

根据
B.a
中有空的
B
行与未被任何
B
行引用的
a
行之间的比率,整个第二个查询可以返回或比第一个查询返回,尽管两个查询也可能返回


另一种可能性是存在对
B
中不存在的
A
行的引用(这意味着缺少外键以保证引用完整性)。如果有这样的行,第一个查询将比第二个查询返回,因为它将排除无效的引用,而第二个查询将包括它们。

这不是一回事。对于基于
A
值同时位于
A
B
中的实体,联接将返回由
A
B
中的值组合而成的行<代码>联合永远不会给你这个-它本质上是行的串联。嗯,联合部分只是我选择的一个尾部。实际上,如果A中的所有值都显示在B表中,即使我从第二个查询中删除了最后三行,我也希望两个查询的工作方式相同。但是由于
B
中可能缺少一些
a
,我将它们与union连接起来。是否确定
B.a
总是设置为某个值?如果某些行在
B.a
中没有值(即如果它们有NULL),则只有第二个查询的第一部分可以返回行,而第二部分什么也得不到。另外,是否实际定义了从B到A的外键,以保证在
B.A
有趣的版本中不会存储错误的引用,但是如果
B.A
有时为空,第二个查询将返回比第一个查询更多的行,不是吗?实际上,它的回报率更低。我的错,我没有指定。如果为空,第二个查询返回的行可能会更少。如果
B.a
中有几行带有空值,而
a
中有许多行未被任何
B
行引用,我怀疑是这样的,因为您用字母填充的字段是表B中的主键。因此,不可能重复。我实际上不理解“视为单个空值”的含义。这两个查询不应该也不(?)返回任何相同的行。联合的右侧部分在第二列中为null,但在第一列中为所有不同的值。这是因为A.A和B.B都是唯一的键。