【问题标题】:MS Access SQL query a table and remove duplicatesMS Access SQL 查询表并删除重复项
【发布时间】:2021-01-08 00:29:55
【问题描述】:

我在这里查看了几篇帖子,找不到答案,但可能是问题和答案略高于我的工资等级。

我有一个包含两个 ID 字段(ID1 和 ID2)以及许多其他列的 MSAccess 表。

我想查询(SELECT 语句)表,需要做两件事。不确定订单是否重要。我希望查询返回表中的所有列。

  • ID1 没有重复项,我根本不在乎哪些记录会被丢弃。
  • ID2 没有重复项,我想保留表中日期字段早于具有相同 ID2 值的记录的其他值的记录。

只是不知道如何使用 SQL Select 语句来做到这一点。

示例数据 - 假设 DateFld 从上到下为 ASC

ID1    ID2    DateFld    ...
1      24
1      24
2      23
3      98
4      23
4      23
5      98
6      72

保留第 1、3、4、8 行

没有索引,因为该表是通过生成表查询创建的;但我可以添加它们。如果您需要更多,请告诉我。

【问题讨论】:

  • 样本数据和期望的结果会有所帮助。也就是说,我怀疑您无法轻松地在 MS Access 中做您想做的事情,除非您的数据有其他您未描述的约束。
  • 是的,需要例子。如果数据类似于:1 12 1 - 必须消除其中之一,因为 ID2 重复?你所说的“重复”到底是什么意思——所有字段都是相同的值? ID1 和 ID2 是唯一的复合索引吗?是否有唯一标识符,例如自动编号?
  • 在您的每个 ID1 的示例数据中,只有 1 个 ID2,尽管超过 1 行。这是巧合还是这条规则适用于您的餐桌?每个 ID2 也可能有重复的 DateFlds 吗?
  • ID2(和 DateFld)对于 ID1 的所有唯一值都是相同的;如上 ID2 所示。

标签: sql ms-access


【解决方案1】:
SELECT
  ID1, 
  ID2, 
  [allOtherColumns]
FROM(
  SELECT 
      ID1, 
      ID2, 
      ROW_NUMBER() OVER (PARTITION BY ID1 ORDER BY ID1) AS ID1Selector, 
      ROW_NUMBER() OVER (PARTITION BY ID2 ORDER BY DateValue ASC) AS ID2Selector,
      [allOtherColumns)
  FROM tbl) AS InnerQry
WHERE ID1Selector=1 AND ID2Selector=1

注意,这是可能在 Access 中工作的 SQL Server 代码。我对 Access 没有太多经验,但我知道 SQL。在 SQL 中,ROW_NUMBER() 窗口函数将 ID1 除以唯一 ID1,因此它遇到的第一个 ID1 将是它选择的唯一一个,ID2Selector 会将行号 1 赋予它在每个人中遇到的最早日期值ID2。

可能有一种更有效的方法来做到这一点,但我总是在 SQL 中这样做。

【讨论】:

  • 感谢 Tyler H,但 Access 不支持 row_number()。
【解决方案2】:

对于此示例数据,您可以使用NOT EXISTS

SELECT t.*
FROM tablename AS t
WHERE NOT EXISTS (
  SELECT 1 FROM tablename
  WHERE ID2 = t.ID2 AND DateFld < t.DateFld
)

结果:

ID1 ID2 DateFld
1   24  ...
2   23  ...
3   98  ...
6   72  ...

【讨论】:

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