SQL Server 2008 R2:仅和仅处于状态

SQL Server 2008 R2:仅和仅处于状态,sql,sql-server,sql-server-2008-r2,Sql,Sql Server,Sql Server 2008 R2,下表中有两个字段: create table teste_r ( colx varchar(10), coly varchar(10) ); colx ----- 2 插入记录: insert into teste_r values('3','A'),('3','B'),('3','C') ,('2','A'),('2','A'),('2','C') ,('1','A'),('1',

下表中有两个字段:

create table teste_r
(
colx varchar(10),
coly varchar(10)
);
 colx    
 -----
 2
插入记录:

insert into teste_r values('3','A'),('3','B'),('3','C')
                        ,('2','A'),('2','A'),('2','C')
                        ,('1','A'),('1','D');
 colx    
 -----
 2
注意:现在我想显示
colx
,它只属于并且只属于
A和C

 colx    
 -----
 2
因此,根据要求,预期结果应为:

 colx    
 -----
 2
预期结果

 colx    
 -----
 2

您可以像这样使用
groupby
HAVING COUNT(DISTINCT coly)

 colx    
 -----
 2
SELECT colx
FROM teste_r r
WHERE r.coly IN('A','C')
GROUP BY colx
HAVING COUNT(distinct coly) = (SELECT COUNT(distinct coly) FROM teste_r r2 WHERE r2.colx = r.colx)
AND COUNT(distinct coly) = 2
这是一个没有余数的关系除法示例。你可以得到更多的信息,这是由乔塞尔科写的

 colx    
 -----
 2

您也可以通过Dwain Camps查看这一点

您可以像这样使用
groupby
HAVING COUNT(DISTINCT coly)

 colx    
 -----
 2
SELECT colx
FROM teste_r r
WHERE r.coly IN('A','C')
GROUP BY colx
HAVING COUNT(distinct coly) = (SELECT COUNT(distinct coly) FROM teste_r r2 WHERE r2.colx = r.colx)
AND COUNT(distinct coly) = 2
select  DISTINCT a.colx
from    teste_r a,
        teste_r b
WHERE   a.colx = b.colx
AND     ((a.coly = 'A' AND b.coly = 'C') OR (a.coly = 'C' AND b.coly = 'A')) 
这是一个没有余数的关系除法示例。你可以得到更多的信息,这是由乔塞尔科写的

 colx    
 -----
 2

您也可以通过Dwain Camps查看此查询,此查询的结果将如您所愿:

 colx    
 -----
 2
select  DISTINCT a.colx
from    teste_r a,
        teste_r b
WHERE   a.colx = b.colx
AND     ((a.coly = 'A' AND b.coly = 'C') OR (a.coly = 'C' AND b.coly = 'A')) 
SELECT DISTINCT
    tr.colx
FROM dbo.teste_r AS tr
WHERE tr.colx IN (SELECT tr2.colx FROM dbo.teste_r AS tr2 WHERE tr2.coly IN ('A', 'C'))
    AND tr.colx NOT IN (SELECT tr2.colx FROM dbo.teste_r AS tr2 WHERE tr2.coly NOT IN ('A', 'C'))

此查询的结果将如您所愿:

 colx    
 -----
 2
SELECT DISTINCT
    tr.colx
FROM dbo.teste_r AS tr
WHERE tr.colx IN (SELECT tr2.colx FROM dbo.teste_r AS tr2 WHERE tr2.coly IN ('A', 'C'))
    AND tr.colx NOT IN (SELECT tr2.colx FROM dbo.teste_r AS tr2 WHERE tr2.coly NOT IN ('A', 'C'))

您可以使用条件聚合来完成此操作:

 colx    
 -----
 2
SELECT colx FROM teste_r
GROUP BY colx
HAVING SUM(CASE WHEN coly NOT IN('A','C') THEN 1 ELSE 0 END)=0 AND COUNT(DISTINCT coly)=2

您可以使用条件聚合来完成此操作:

 colx    
 -----
 2
SELECT colx FROM teste_r
GROUP BY colx
HAVING SUM(CASE WHEN coly NOT IN('A','C') THEN 1 ELSE 0 END)=0 AND COUNT(DISTINCT coly)=2

您可以使用
不存在

 colx    
 -----
 2
select t.colx
from teste_r t
where t.coly IN('A','C')
  and not exists ( select * 
                   from teste_r
                   where colx = t.colx
                     and coly not in ('A', 'C'))
group by t.colx
having count(distinct t.coly) = 2

您可以使用
不存在

 colx    
 -----
 2
select t.colx
from teste_r t
where t.coly IN('A','C')
  and not exists ( select * 
                   from teste_r
                   where colx = t.colx
                     and coly not in ('A', 'C'))
group by t.colx
having count(distinct t.coly) = 2

这个查询也给出了3。嗯,是的,我对唯一和唯一的a和c部分感到困惑,认为只有2才是答案的事实是一个错误,哈哈。。。修正它…这个查询也给出了3。嗯,是的,我对唯一和唯一的a和c部分感到困惑,认为只有2是答案应该是一个错误lol。。。修好它…太棒了!非常感谢。请在表中再添加两条记录以检查脚本。”插入测试值('4','A'),('5','C');令人惊叹的!非常感谢。请在表中再添加两条记录以检查脚本。”插入测试值('4','A'),('5','C');请在表中再添加2条记录以检查脚本。”插入测试值('4','A'),('5','C');请在表中再添加2条记录以检查脚本。”插入测试值('4','A'),('5','C');
 colx    
 -----
 2