从每个id
而不是表格中的所有其他项目返回一个项目的最佳方式是什么?目前,以下查询将返回所有制造商
SELECT m.name
FROM `default_ps_products` p
INNER JOIN `default_ps_products_manufacturers` m ON p.manufacturer_id = m.id
答案 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会更好。