id
从每个项目而不是表中的所有其他项目返回一个项目的最佳方法是什么。目前以下查询返回所有厂家
SELECT m.name
FROM `default_ps_products` p
INNER JOIN `default_ps_products_manufacturers` m ON p.manufacturer_id = m.id
我通过使用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
我可以想到 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 通常更快,但您必须在之后重新创建所有索引、约束和触发器..
将所有内容都拉到新表中,然后删除第一个表并将新表重命名为旧表名示例。
create table t1 as select distinct * from t2; drop table t1; rename t2 to t1;
方法 3 根据 rowid 删除 where 存在的地方。例子
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)
请注意,您不必为方法 4 使用 nvl
经常使用 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 会更好。