2016-04-12 18 views
2

私はテーブルを持っている:MS SQL:複数行の基準にクエリ

CREATE TABLE Cl 
(
    PropId int, 
    ClId int 
); 
INSERT INTO Cl 
(PropId, ClId) 
VALUES 
(1, 1), 
(1, 2), 
(1, 3), 
(2, 1), 
(2, 2), 
(3, 1), 
(4, 1), 
(4, 2), 
(5, 1), 
(5, 2); 

PropId ClId 
1  1 
1  2 
1  3 
2  1 
2  2 
3  1 
4  1 
4  2 
5  1 
5  2 

私は返すクエリを構築したいと思います:

PropId 
2 
4 
5 

私の「WHERE」私は持っている状態で、 PropId = 2。テーブル結合は、ClId値を使用する必要があります。前もって感謝します。 sqlfiddle

+2

「PropId in(2,4,5)」では最も簡単な方法がありますが、探しているロジックと異なるタイプのロジックがあるかもしれません。その論理は疑問であるはずです。 –

+0

あなたは間違いを犯しました: 'PropId = 2'の代わりに、' CiId = 2'と言ったかったのです。私は正しい? –

+0

お返事ありがとうございます。私はPropIdでわずか2しか持っていません。まず、CliIdの値に行く必要があり、それらに応じて(値とセグメンテーションによって)私のPropIdの出力が得られます。不明確な説明をおかけして申し訳ありません。 – andmike

答えて

0

group byhavingを使用できます。質問へのコメントについては

select propid 
from c1 
group by propid 
having sum(case when clid = 1 then 1 else 0 end) > 0 and 
     sum(case when clid = 2 then 1 else 0 end) > 0 and 
     count(distinct clid) = 2; 
+0

ゴードン、OPは質問に私のコメントに返信を追加しました。それを読んでください。私の答えも見てください。 –

0

::ここでは一つの方法である

(...)私が持っている唯一の2の私のPropIdで、私はCliId に行かなければならないすべての最初の値とそれらに応じて(値とそのセグメンテーション) 私のPropId出力。

SELECT C.PropId 
FROM Cl C INNER JOIN (
    SELECT B.ClId 
    FROM Cl B 
    WHERE B.PropId = 2 
    ) D ON D.Clid = C.Clid 
GROUP BY C.PropID 
HAVING COUNT(c.ClId)>1 

注:結果はとなります(...)segmentationであなたは1以上であるカウントレコードのセットを意味

場合は、データをこのように参加する必要があります:{1, 2, 4, 5}。どうして? DサブクエリはClId{1, 2}のセットを返し、条件を満たすレコードが4 PropIdになるためです。

+0

ご協力いただきありがとうございます。 「セグメント化」とは、ClId列レコードの完全一致を意味します。クエリの "1"の結果は、PropId 1のClId列の追加の "3"値のために超過しています。この条件に達するためにクエリを変更する方法はありますか?前もって感謝します。 – andmike

+0

部分一致は: 'Clid = {1,2,3,4,5}'です。私はあなたの論理を得ることができません。あなたのデータを見てください。 –