我有以下格式的三个表
A B C
----- ----- -----
aKey bKey fk_c_b
fk_b_a c_enum
c_value
aKey
并且bKey
每个表都是主键,C
没有主键。fk_b_a
并且C.fk_c_b
是指向父表的外键。c_enum
是 87 个不同值的枚举。C.c_value
是浮点数,可以是任何值
表之间的关系是:
- (
A.aKey
) 0..1 --- * (B.fk_b_a
) - (
B.bKey
) 0..1 --- * (C.fk_c_b
)
有:
- A 中 57,668 行
- B 中的 650,768 行
- C 中的 34,734 行
我需要显示所有c_enum
值及其父母的不同列表,但是如果两行C
共享相同的fk_c_b
值c_value
但不同的c_enum
值,我可以不使用不同列表中的这两行。
select aKey, bKey, c_enum, c_value, newid() as id
into #myResultSet
from A
inner join B on fk_b_a = aKey
inner join C as temp1 on fk_c_b = bKey
where c_value not in (select c_value from C as temp2
where temp1.c_enum <> temp2.c_enum
and temp1.fk_c_b = temp2.fk_c_b
and temp1.c_value = temp2.c_value)
--This is the step that I do not know how to optimize
delete #myResultSet where id <> (select top 1 id from #myResultSet as t1 where #myResultSet.c_enum = t1.c_enum)
同样在该过程中,我需要最小化 aKey 和 bKey 的不同计数。所以如果我做了
select count(distinct aKey), count(distinct bKey), count(*) from #myResultSet
结果将具有可能的最小值。最佳结果是1, 1, 87
,最坏情况是87, 87, 87
。我当前的方法不会尝试获得最小值(我的结果还14, 17, 87
不错,但我认为这只是这个数据集的运气,在不同的数据集上运行可能会返回更糟糕的结果)而且我在弄清楚时遇到了很多麻烦如何以正确的方式做到这一点。
解决这个问题的正确方法是什么?我目前的方法并不是最优的,我一直很难弄清楚我需要做什么来构建和#myResultSet
的最小值。count(distinct aKey)
count(distinct bKey)
我想我找到了解决方案。在删除步骤中,我将这两个 order by 子句放在
这给了我
10,13,87
我认为是我可以用我的数据集获得的最佳解决方案。如果我错了或者有更好的方法可以做到这一点,欢迎提供更多答案。