以下问题:
我有两张桌子(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。有一百万行。我只想在另一个列表的一个键上挂两个列表
答案 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”的列显示对关系数据库缺乏了解。主键在其主表中没有重复项。