SQL:在另一个表的键上挂两个表,没有所有组合

时间:2018-06-07 09:32:17

标签: sql vba ms-access

以下问题:

我有两张桌子(PK = PrimaryKey):

表B(是的,它是B,而不是A.编辑:但A确实存在):

ColumnHeader_PK_A    ColumnHeader_PK_B
PK_A_1               PK_B_1
PK_A_1               PK_B_2
PK_A_1               PK_B_3
PK_A_2               PK_B_1
PK_A_2               PK_B_2

表C:

ColumnHeader_PK_A    ColumnHeader_PK_C
PK_A_1               PK_C_1
PK_A_1               PK_C_2
PK_A_1               PK_C_3
PK_A_1               PK_C_4
PK_A_1               PK_C_5
PK_A_2               PK_C_1

我需要一个如下结果:

ColumnHeader_A    ColumnHeader_B    ColumnHeader_C
PK_A_1            PK_B_1            PK_C_1
PK_A_1            PK_B_2            PK_C_2
PK_A_1            PK_B_3            PK_C_3
PK_A_1            Null              PK_C_4
PK_A_1            Null              PK_C_5
PK_A_2            PK_B_1            PK_C_1
PK_A_2            PK_B_2            Null

我认为我的问题非常简单,但我在近12h的思考中找不到解决方案。我使用MS Access,VBA不会是一个问题,但我需要SQL for Performance。有一百万行。我只想在另一个列表的一个键上挂两个列表

1 个答案:

答案 0 :(得分:0)

这在MS Access中非常复杂,尽管在其他数据库中并不那么难。

您需要做的是枚举值,然后join。您可以使用子查询进行枚举。

select pk_a,
       max(pk_b) as pk_b,
       max(pk_c) as pk_c
from ((select b.pk_a, b.pk_b, NULL as pk_c
              (select count(*)
               from b as b2
               where b2.pk_a = b.pk_a and b2.pk_b <= b.pk_b
             ) as seqnum
       from b
      )
      union all
      (select c.pk_a, NULL as pk_b, NULL as pk_c
              (select count(*)
               from c as c2
               where c2.pk_a = c.pk_a and c2.pk_x <= c.pk_c
             ) as seqnum
       from c
      )
     ) bc
group by pk_a, seqnum;

请注意,名为“pk”的列显示对关系数据库缺乏了解。主键在其主表中没有重复项。