我想知道是否有一种不用联接或/和具有可返回与下面的查询相同的结果的子句的查询的方法吗?我已经找到了类似的问题(select and count rows),但没有找到答案。
SELECT ID, CATEGORY, PRODUCT, DESC
FROM SALES s
JOIN (SELECT ID, COUNT(CATEGORY)
FROM SALES
GROUP by ID
HAVING count(CATEGORY)=1) S2 ON S.ID=S2.ID;
所以表看起来像
ID | Country | Product | DESC
1 | USA | Cream | Super cream
1 | Canada | Toothpaste| Great Toothpaste
2 | Germany | Beer | Tasty Beer
我想要得到的结果是
ID | Country | Product | DESC
2 | Germany | Beer | Tasty Beer
因为id = 1分配了2个不同的国家/地区
我正在使用SQL Server
通常,我对“最快”的解决方案感兴趣。桌子很大,我只是想知道是否有办法使它变得更聪明。
答案 0 :(得分:0)
您可能要考虑此查询。
string
答案 1 :(得分:0)
您可以尝试以下查询:
SELECT ID, CATEGORY, PRODUCT, DESC
FROM SALES s
WHERE 1 = (
SELECT COUNT(*)
FROM SALES x
WHERE x.ID = s.ID
);
答案 2 :(得分:0)
一种方法使用窗口函数:
SELECT ID, CATEGORY, PRODUCT, DESC
FROM (SELECT s.*, COUNT(*) OVER (PARTITION BY ID) as cnt
FROM SALES s
) s
WHERE cnt = 1;
但是,最快的解决方案将需要唯一的ID和索引。那应该是:
select s.*
from sales s
where not exists (select 1
from sales s2
where s2.id = s.id and
s2.<unique key> <> s.<unique key>
);
这可以利用(id, <unique key>)
上的索引。
注意:此特定表述假设category
从未为null
。