消除SQL查询中的重复项

时间:2013-04-08 19:44:10

标签: mysql sql

从每个id而不是表格中的所有其他项目返回一个项目的最佳方式是什么?目前,以下查询将返回所有制造商

SELECT m.name
FROM  `default_ps_products` p
INNER JOIN  `default_ps_products_manufacturers` m ON p.manufacturer_id = m.id

3 个答案:

答案 0 :(得分:2)

我在查询中使用DISTINCT值解决了我的问题:

SELECT DISTINCT m.name, m.id
FROM  `default_ps_products` p
INNER JOIN  `default_ps_products_manufacturers` m ON p.manufacturer_id = m.id
ORDER BY m.name

答案 1 :(得分:0)

我可以考虑删除重复行的4种主要方法 方法1 删除大于最小或小于最大rowid值的所有行。实施例

delete from tableName a where rowid> (select min(rowid) from tableName b where a.key=b.key and a.key2=b.key2)

方法2 通常更快但你必须在之后重新创建所有索引,约束和触发器。
将all全部拉为新表,然后删除第一个表并将新表重命名为旧表名 示例

create table t1 as select distinct * from t2; drop table t1; rename t2 to t1;

方法3 删除基于rowid存在的位置。示例

delete from tableName a where exists(select 'x' from tableName b where a.key1=b.key1 and a.key2=b.key2 and b.rowid >a.rowid)  Note if nulls are on column use nvl on column name.    

方法4 收集每个键值的第一行并删除不在此集合中的行。实施例

delete from tableName a where rowid not in(select min(rowid) from tableName b group by key1, key2)

请注意,您不必将nvl用于方法4

答案 2 :(得分:0)

使用DISTINCT通常是一种不好的做法。您的SELECT语句可能有问题,或者您的数据结构未规范化。

在你的情况下,我会使用它(假设default_ps_products_manufacturers有唯一的记录)。

SELECT m.id, m.name
FROM  default_ps_products_manufacturers m
WHERE EXISTS (SELECT 1 FROM default_ps_products p WHERE p.manufacturer_id = m.id)

或使用IN的等效查询:

SELECT m.id, m.name
FROM  default_ps_products_manufacturers m
WHERE m.id IN (SELECT p.manufacturer_id FROM default_ps_products p)

唯一的事情 - 在所有可能的查询之间,最好选择具有更好执行计划的查询。这可能取决于您的数据库的供应商和/或物理结构,统计数据等。

我认为在大多数情况下,EXISTS会更好。