基本问题描述:
带有数据的大表,其中一些是无效的(由于先前的分辨率损失,大多数是“按设计”)
一个较小的表,列出了大表中字段子集的有效组合
一个有时具有“真实”无效数据的进程 - 小表认为无效的条目,但由于邮件文件中的配置错误或数据损坏而被“使用”(在这种情况下,文档被邮寄)。
目标 - 阻止分区上的无效条目(client-doc组合),但如果分区中的条目为0,则不阻止分区上的任何条目。基本上 - 如果所有这些都不好,耸耸肩并假设它们都足够好。
原始答案: 加入大小表(过滤连接),分区上不同。左连接结果和小表到大表,写入小表条目存在的条件(好行)或不存在的子查询条目(无有效条目),否则排除。
缺点 - 最终输入,大表X2,小表X2。大表在分区上是自联接的,从算法运行时的角度来看,这是非常痛苦的。
所以 - 问题:是否有更好的算法?
为Jim编辑 - 以具体术语谈论抽象算法:
表A - 大,包含数据,有分区,称之为“部分”select A.*
from A
left join B on A.Filt = B.Filt
left join (select A.Part from A join B on A.Filt = B.Filt ) C on A.Part = C.Part
where B.Filt is not null or C.Part is null
任何人都可以使用更好的查询生成相同的结果吗? (或者,坦率地说,任何不同的查询。)
我在MS Access中恭维,因此“为空”并避免“现有”(关键字)子查询 - 我相信这会使用不同的语法来实现相同的算法,尽管任何知道更好的人都欢迎纠正理论