MS Access SQL查询表并删除重复项

时间:2020-09-21 21:35:43

标签: sql ms-access

我在这里查看了几篇文章,但找不到答案,但是可能是问题和答案比我的薪水等级高一点。

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

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

  • 没有重复的ID1,我根本不在乎哪个记录被扔掉了。
  • 没有重复的ID2,我想保留记录,其中表中的Date字段早于具有相同ID2值的记录的其他值。

只是无法弄清楚如何使用SQL Select语句来做到这一点。

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

<table id="userWall">
  <tbody>
    <td class="tableLeft">
      <b>example</b>
      <p>text here</p>
    </td>
    <td class="tableRight">
      <b>date</b>
    </td>
  </tbody>
</table>

保留第1、3、4、8行

无索引,因为此表是通过make表查询创建的;但我可以添加它们。让我知道您是否需要更多。

2 个答案:

答案 0 :(得分:1)

对于此示例数据,您可以使用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  ...

答案 1 :(得分:-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将是它唯一选择的ID1,并且ID2Selector会将行号1赋予它在每个个体中遇到的最早的日期值ID2。

也许有一种更有效的方法来做到这一点,但这就是我总是在SQL中这样做的方式。

相关问题