【问题标题】:SQL: select all records not selected by another querySQL:选择其他查询未选择的所有记录
【发布时间】:2011-06-01 18:00:51
【问题描述】:

我正在寻找一个 SQL 查询来选择同一表上另一个查询未选择的所有记录。 具体来说,我想选择具有特定字段('fieldA')重复的所有记录,然后删除除其中一个之外的所有记录。

因此,一个 select 语句可能类似于以下内容(这是行不通的!):

select * from table where id not in(select * from table group by fieldA)

如果无法进行单个查询,那么最有效的解决方案是什么?

【问题讨论】:

  • 在内部 SELECT 语句中将 * 更改为 id...这不起作用吗?
  • 我已经尝试过了,但是 phpMyAdmin 崩溃了。
  • 剩余行的标准是什么?

标签: mysql sql


【解决方案1】:

具体来说,我想选择具有特定字段('fieldA')重复项的所有记录,然后删除除其中一个之外的所有记录。

在这种情况下,join it

delete x 
from myTable x
 join myTable z on x.field = z.field
where x.id > z.id

【讨论】:

  • +1 不错,没有聚合!你应该补充回答,如果你想要MAX(ID),这会保留MIN(ID),那么你只需将方向反转到x.id < z.id
  • 抱歉回复延迟。这个答案很棒,正是我想要的 - 谢谢!
【解决方案2】:

类似:

SELECT id FROM table WHERE id IN (
    SELECT MIN(id) FROM table GROUP BY fieldA HAVING COUNT(*) > 1
)

【讨论】:

    【解决方案3】:

    如果您将 not IN sub SELECT 语句更改为仅返回一列 (ID),它应该可以工作 -

    http://blog.sqlauthority.com/2008/04/22/sql-server-better-performance-left-join-or-not-in/

    【讨论】:

      猜你喜欢
      • 2018-02-07
      • 2013-12-15
      • 2013-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多