2017-02-08 4 views
0

私はSQL Serverのクエリの明確化

Txn_Id Txn_Type 
___________________ 
1   101 
1   102 
1   103 
1   104 
2   101 
2   102 
2   104 
3   101 
3   104 

は、私が唯一の例の場合は101と104をtxn_typeた行をしたい、以下のようなテーブルを持っている。私は、上記のデータのみTxn_Id「3」を取得する必要があります。

私は以下のようにして結果を得ました。これを実現するための単一のクエリを持つことは可能ですか?

Select txn_id from Txn where txn_id in (Select txn_id from Txn where txn_id = 101) and txn_id =104. 
+0

-Pls私は正しいのですか? – balaji

答えて

3
Select txn_id from Txn where txn_type in (101,104) 

オプション2

Select txn_id from Txn where (txn_type = 101 OR txn_type=104) 

は、あなたの上記のコメントを1としてのみ "3"

Select distinct txn_id from Txn t1 where (txn_type = 101 OR txn_type=104) 
and not exists(
select 1 from Txn t2 where t2.txn_type IN (102,103) and t2.txn_id = t1.txn_id 
) 
+0

私はOPがtxn_type 101と104だけを持つ行を望んでいると感じています。結果のtxn_idには他のtxn_idが入ってはいけません。私たちはあなたのクエリを実行すると、すべてのtxn_id(つまり1,2,3)を取得します。しかし、OPはtxn_id 3だけを必要とします。 – balaji

+0

はい私はtxn_idを3にします。 – Srinivasan

+0

@Mitあなたの最後の解決策はトリックです...ありがとう。 – balaji

0

こんにちはを取得するにはあなただけの

txn_id = 3(最大)が必要です

下記のコードを見つけてください。バラジが指摘したようにあなたは、たとえば、表(4101)および(4104)内のレコードの別のペアを追加した場合、誤った結果を返しますので、

DECLARE @Table1 TABLE 
    (txn_id int, Txn_Type int) 
; 

INSERT INTO @Table1 
    (txn_id , Txn_Type) 
VALUES 
    (1, 101), 
    (1, 102), 
    (1, 103), 
    (1, 104), 
    (2, 101), 
    (2, 102), 
    (2, 104), 
    (3, 101), 
    (3, 104) 
    ; 


Select max(txn_id),Txn_Type 
    from @Table1 where item in (101,104) 
    group by Txn_Type 
+0

このソリューションがうまくいくかもしれませんが、txn_id 2にTxn_Types 101,104しかない場合はどうなりますか?その場合、あなたのクエリは必要な出力を返しません.... – balaji

+0

それは2回テーブルを打つことなく行うことはできません –

+0

テーブルに2回参加することでそれを行う方法について興味がありますが、私はOPが望んでいることを理解していますそれは単一のクエリになる.... – balaji

0

は、@Ayushソリューションは、柔軟ではありません。 IMOでは、フィルタリングのためにテーブルを自分自身に参加させる必要があります。次のようになります。

DECLARE @Table1 TABLE 
    (txn_id int, Txn_Type int); 

INSERT INTO @Table1 
    (txn_id , Txn_Type) 
VALUES 
    (1, 101), 
    (1, 102), 
    (1, 103), 
    (1, 104), 
    (2, 101), 
    (2, 102), 
    (2, 104), 
    (3, 101), 
    (3, 104), 
    (4, 101), 
    (4, 104); 

select t1.* 
from @Table1 t1 
inner join (select txn_id, count(*) as total 
     from @Table1 
     group by Txn_id 
     having count(*) < 3 
     ) t2 on t2.txn_id = t1.txn_id 
where t1.Txn_Type in (101,104)