SQL选择只包含特定值的行

时间:2011-05-24 12:41:28

标签: sql tsql select filter

我有一张桌子

Col 1 Col 2 Col 3
1       A     1
2       A     2
3       B     1
4       C     1
5       C     2
6       D     1

如何只获得Col 3 = 1的唯一行?

我想获得第3行和第6行(第2列分别为B和D)。我不想要A和C,因为他们也有Col 3 = 2。

我尝试过以下方面:

select col 2 from table group by col 2 having count(col 3) = 1

但是这只会导致Col 2的结果,所以我不确定Col 3的内容是否为1。

编辑:对不起,伙计们也许我没有说清楚我的问题。我想获得Col 2的所有行,其中只包含Col 3 = 1 AND ONLY 1

因此,如果我尝试了WHERE Col 3= 1,它将返回4行,因为A有1.但由于A也有一行Col 3 = 2,我不希望这样,对于C来说也是如此。表,我希望最终结果只显示2行,B和D.

我的示例表是一个示例,我实际上有大约5000行要过滤,否则我会像你们建议的那样做:)

5 个答案:

答案 0 :(得分:9)

SELECT col2
FROM your_table
GROUP BY col2
HAVING MAX(col3) = 1 AND MIN(Col3) = 1

或者

SELECT a.col2 
FROM your_table a
WHERE a.col3=1 AND NOT EXISTS(SELECT *
                              FROM your_table b 
                              WHERE a.col2=b.col2 AND b.col3<>1)

答案 1 :(得分:2)

您可能正在寻找的是WHERE条款。

SELECT * FROM YouTable WHERE col3 = 1 AND col2 in ('B','D');

答案 2 :(得分:2)

;with T ([Col 1], [Col 2], [Col 3]) as
(
select 1,       'A',     1 union all
select 2,       'A',     2 union all
select 3,       'B',     1 union all
select 4,       'C',     1 union all
select 5,       'C',     2 union all
select 6,       'D',     1
)


select *
from T
  left outer join 
    (
      select distinct [Col 2] 
      from T
      where [Col 3] <> 1
    ) as T2
  on T.[Col 2] = T2.[Col 2]
where T.[Col 3] = 1 and
      T2.[Col 2] is null

答案 3 :(得分:0)

确切地知道你想要得到的东西有点难,但这是我最好的猜测:

SELECT * FROM theTable WHERE col2 NOT IN
  (SELECT col2 FROM theTable WHERE col3 <> 1)

答案 4 :(得分:0)

SELECT * FROM #temp t1
WHERE EXISTS 
(
select Col2 from #Temp t2 
WHERE t2.Col2 = t1.Col2
group by col2 
having count(col3) = 1
)

使用MS SQL 2008及以下测试(如果我的答案不正确,可能会帮助其他人测试他们......):

CREATE TABLE #temp 
( 
    Col1 INT, 
    Col2 CHAR(1),
    Col3 INT
)

INSERT INTO #Temp    
    (Col1, Col2, Col3)
SELECT    1,'A',1
UNION
SELECT    2,'A',2
UNION
SELECT  3,'B', 1
UNION 
SELECT 4,'C',1
UNION 
SELECT 5,'C',2
UNION 
SELECT 6,'D',1

SELECT * FROM #temp t1
WHERE EXISTS 
(
select Col2 from #temp t2 
WHERE t2.Col2 = t1.Col2
group by col2 
having count(col3) = 1
)

DROP TABLE #temp