Sql 当计数=1时,仅选择行-无需额外选择或/和

Sql 当计数=1时,仅选择行-无需额外选择或/和,sql,sql-server,etl,Sql,Sql Server,Etl,我想知道是否有一种方法可以构建一个查询,而不使用join或/和have子句来返回与下面的查询相同的结果?我已经找到了类似的问题,但没有找到答案 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

我想知道是否有一种方法可以构建一个查询,而不使用join或/和have子句来返回与下面的查询相同的结果?我已经找到了类似的问题,但没有找到答案

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 |国家|产品|描述 1 |美国|奶油|超级奶油 1 |加拿大|牙膏|优质牙膏 2 |德国|啤酒|美味啤酒 我想得到的结果是

ID |国家|产品|描述 2 |德国|啤酒|美味啤酒 因为id=1分配了两个不同的国家/地区

我正在使用SQL Server


一般来说,我对“最快”的解决方案感兴趣。这个表很大,我只是想知道是否有更聪明的方法。

您可能想考虑这个查询。

select t2.id, t2.category, t2.product, t2.desc from (
    select id, category, product,
        case when (select count(1) from sales where id=t1.id group by id) as ct
        ,desc
    from sales t1) t2 where t2.ct = 1

您可以尝试以下查询:

SELECT ID, CATEGORY, PRODUCT, DESC
FROM SALES s
WHERE 1 = (
  SELECT COUNT(*)
  FROM SALES x
  WHERE x.ID = s.ID
);

一种方法使用窗口函数:

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上的索引


注意:此特定公式假设类别从不为空。

更新您的问题。。添加适当的数据样本和预期结果请提供预期结果。向“计数”列添加别名,只需添加where S2.CNT=1您的特定SQL数据库是什么?e、 g.MySQL、SQL Server、Oracle、Postgres、DB2等。。如果您使用的是MySQL,那么请告诉我们您使用的是哪个版本。非常感谢您的评论,我添加了所需的信息哦,我非常喜欢第二个解决方案,谢谢!我将测试它并检查performance@Trefle . . . 确保你有推荐的索引。