仅当count = 1时才选择行-无需其他SELECT或/且具有

时间:2019-10-11 05:08:09

标签: sql sql-server etl

我想知道是否有一种不用联接或/和具有可返回与下面的查询相同的结果的子句的查询的方法吗?我已经找到了类似的问题(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

通常,我对“最快”的解决方案感兴趣。桌子很大,我只是想知道是否有办法使它变得更聪明。

3 个答案:

答案 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