2017-02-08 4 views
0

У меня есть таблица, как показано ниже,Sql уточнение запроса сервера

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

Я хочу строк, который имеет только txn_type 101 и 104. Для например., Я должен получить только 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) 

Чтобы получить только "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 (макс)

Пожалуйста, найдите код ниже.

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

Это невозможно сделать, не попав в таблицу дважды –

+0

Просто любопытно, как вы можете это сделать, присоединившись к таблице дважды, но я понимаю, что OP хочет он должен быть в одном запросе .... – balaji

0

Как Баладжи отметил, решение @Ayush не является гибким, так как будет возвращать неверные результаты, если вы, например, добавить еще пару записей в таблице (4,101) и (4,104). 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) 
Смежные вопросы