【问题标题】:MS Access SQL - Removing Duplicates From QueryMS Access SQL - 从查询中删除重复项
【发布时间】:2020-08-17 02:07:10
【问题描述】:

MS Access SQL - 这是一个与性能相关的通用重复问题。所以,我没有具体的示例查询,但我相信我已经在 3 个语句中清楚而简单地解释了下面的情况。

我有一个选择许多列的标准/复杂 SQL 查询;一些计算出来的,一些带星号的,还有一些按名称命名的——例如(tab1.*, (tab2.co1 & tab2.col2) as computedFld1, tab3.col4, etc)。

这个查询连接了大约 10 个表。 Where 子句基于用户指定的过滤器,这些过滤器可以基于所有 10 个表中存在的任何字段。

基于这些过滤器,我有时可以获得具有相同 tab4.ID 值的记录。

问题:消除具有相同 tab4.ID 值的重复结果行的最佳方法是什么。我不在乎哪些行被淘汰。它们会在不重要的方面有所不同。

或者,如果重要的话,它们会有所不同,因为它们将具有不同的 tab5.ID 值;我想用 LARGEST tab5.ID 值保留结果行。

但如果第一个查询比第二个查询执行得更好,那么我真的不在乎哪些行会被淘汰。性能更重要。

我早上大部分时间都在做这件事,我担心这个问题的答案超出了我的工资标准。我尝试过 Group By tab4.ID,但不能在 Select 子句中使用“*”;还有很多其他的事情,我只是经常把头撞到墙上。

【问题讨论】:

  • 使用SELECT * 不是必须的,只是为了方便。那么为什么不直接列出您需要的列呢?

标签: sql ms-access


【解决方案1】:

Access 不支持 CTE,但您可以对已保存的查询执行类似操作。
因此,首先为查询中具有相同名称的列设置别名,例如:

SELECT tab4.ID AS tab4_id, tab5.ID AS tab5_id, ........

然后将您的查询保存为myquery

然后你可以像这样使用这个保存的查询:

SELECT q1.*
FROM myquery AS q1
WHERE q1.tab5_id = (SELECT MAX(q2.tab5_id) FROM myquery AS q2 WHERE q2.tab4_id = q1.tab4_id)

如果每个 tab4_id 没有重复的 tab5_ids,这将为每个 tab4_id 返回 1 行。
如果有重复,则必须提供附加条件。

【讨论】:

    猜你喜欢
    • 2021-01-08
    • 2020-09-02
    • 2014-07-03
    • 1970-01-01
    • 2020-05-26
    • 2012-01-16
    • 2019-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多