2011-05-24 12 views
7

私はテーブルを持っているようにSQL行を選択

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

としてどのように私はコル3 = 1を持っているユニーク行を取得できますか?

私は3行目と6行目を取得したい(それぞれCol 2 = BとD)。彼らはCol 3 = 2も持っているので、私はAもCも望んでいません。

私はの線に沿って何かしようとしました:

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

しかし、私はコル3つの内容= 1かどう不確かだので、結果だけのためにコル2を立ち上げることを。

EDIT:ご迷惑をおかけして申し訳ございません。 Col 3 = 1を含むCol 2のすべての行を取得したい0 そして1のみ

もし私がWHERE Col 3= 1を試してみると、Aは1であるので4行を返します。しかし、AにもCol 3 = 2の行があるので、Cと同じです。この例の表から、

私の例のテーブルは例ですが、実際にはフィルタリングするのに約5000行あります。そうでなければ私はあなたの提案どおりにします:)

+1

選択*テーブルからcol3という= 1 – AllisonC

+5

t'is時間が読みしますSQLチュートリアル:http://www.w3schools.com/sql/default.asp –

+2

申し訳ありませんが、それはそう簡単ではありません。私がAllisonCによってそのSQLクエリから推定された何かを見逃していない限り。 – MHTri

答えて

6
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) 
+0

ありがとうございます、これはうまくいきました! – MHTri

+0

あなたは 'HAVING AVG(col3)= 1'を実行することもできます –

+0

最後に2番目のものは' b.col3 <> 1'ですか? – 322896

1

あなたが探しているものはWHEREです。

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

はハードコードされています! –

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 
0

それはあなたが取得しようとしている内容を正確に把握するために少し難しいですが、これは私の最高の推測です:

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

t MS SQL2008とestedと(私の答えは、それはHALP他の人が彼らをテストすることが正しいもの...ではありませんので、場合)以下:

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