如何使用group by和/或have从表中获取欺骗

时间:2018-09-24 17:21:01

标签: sql sql-server

如果我有这张桌子:

id | aux_id | name
------------------
1  | 22     | foo
2  | 22     | bar
3  | 19     | baz

如何获得结果,显示与至少一个其他记录共享aux_id的名称?

name
----
foo
bar

我知道我需要使用GROUP BY和/或HAVING,但这不起作用:

SELECT name FROM my_table
GROUP BY aux_id
HAVING COUNT(aux_id) > 1
  

列“名称”在选择列表中无效,因为该列未包含在聚合函数或GROUP BY子句中。

4 个答案:

答案 0 :(得分:3)

exists怎么样?

select t.name
from my_table t
where exists (select 1
              from my_table t2
              where t2.aux_id = t.aux_id and t2.name <> t.name
             );

答案 1 :(得分:2)

我会使用exists

select t.name
from table t
where exists (select 1 from table t1 where t1.aux_id = t.aux_id and t1.id <> t.id);

如果不使用group by子句,可以覆盖所有列,这是一个优势。

答案 2 :(得分:1)

另一种选择,只是为了好玩...

scipy.spatial.Delaunay

答案 3 :(得分:1)

按作品归类,恕我直言(在大型数据中表现不佳,就像在EXISTS上那样):

select * from myTable 
where aux_id in 
  (select aux_id 
   from myTable 
   group by aux_id 
   having count(*) > 1)

SQLFiddle Demo