我有一张桌子
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行要过滤,否则我会像你们建议的那样做:)
答案 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