sql如何选择columna和columnb,其中columnb具有不同的值

kknvjkwl  于 2021-07-24  发布在  Java
关注(0)|答案(4)|浏览(331)

我有张table叫emp

id| name  
1 | jon  
1 | trav  
2 | jon  
2 | jon    
3 | jon
3 | jon

我只想选择名称列中具有值“jon”的不同id。
我不希望id中有一个值“jon”,另一个值是name列中的其他值。
输出应如下所示:

id|name  
2 |jon  
3 |jon
fzwojiic

fzwojiic1#

您可以使用以下方法
逻辑是找出名称总数和名称计数(按id,其中name='jon',如果匹配,则返回输出)。
这里有一种方法。
--使用max,因为我们在按id分组时需要一个聚合函数,以便将任何其他列带入。

create table t(id int, name varchar(50))

insert into t 
select 1,'jon'  union all
select 1,'trav' union all 
select 2,'jon'  union all
select 2,'jon'  union all  
select 3,'jon'  union all
select 3,'jon'

select id,max(name)
  from t 
 group by id
having count(distinct name)=count(distinct case when name='jon' then 1 end)

+----+-----------+
| id | max(name) |
+----+-----------+
|  2 | jon       |
|  3 | jon       |
+----+-----------+

db小提琴链接https://dbfiddle.uk/?rdbms=mysql_5.6&fiddle=637432cca3238285cb888889e1fa6ec7

kokeuurv

kokeuurv2#

SELECT id, name
FROM emp
WHERE name = 'jon'
GROUP BY id, name
HAVING COUNT(*) > 1
nwo49xxi

nwo49xxi3#

notexists子句在这里会很好地工作,而且也会很好地执行。

SELECT id, name
FROM tbl t
WHERE name = 'jon'
AND NOT EXISTS (SELECT 1 FROM tbl a WHERE a.id = t.id AND a.name != t.name)
8fsztsew

8fsztsew4#

我会用:

select id, min(name) as name
from emp
group by id
having min(name) = max(name) and min(name) = 'Jon';

相关问题