Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Вопрос по выборке из таблицы  [new]
Прогер_самоучка
Member

Откуда:
Сообщений: 69023
Добрый день.
Есть таблица для примера
ID	smid	code	price
1	1	100	1000
3	1	101	2000
5	2	25	3000
6	3	100	4000
7	3	310	5000
Подскажите, как можно получить с одинаковыми smid только те строки, в которых есть code=100 и code=101 ?
Если использовать or , то получим "лишнее", если использовать and, то ничего не получим(условие смотрит для одной строки и, естественно, ничего не возвращает, так как в каждой строке только 1 код)

В итоге нужно получить следующую выборку
ID	smid	code	price
1	1	100	1000
3	1	101	2000
Здесь smid одинаковый, а также присутствуют оба кода.
Подскажите, как этого добиться?
23 июл 13, 13:07    [14603769]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по выборке из таблицы  [new]
Добрый Э - Эх
Guest
exists
23 июл 13, 13:11    [14603799]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по выборке из таблицы  [new]
Прогер_самоучка
Member

Откуда:
Сообщений: 69023
Добрый Э - Эх
exists

Пробовал. Пробовал и оператор IN. Либо я неправильно понимаю как их нужно использовать, либо нужно использовать что-то другое.
select  t1.ID,t1.smid,t1.code,t1.price from  tbl_Test as t1
where exists ( select * from tbl_Test as t2 where t1.id=t2.id and t2.code=100 or  t2.code=101)

Опять же, если or, то возвращает абсолютно все записи, если and, то ни одной. Как правильно здесь использовать exists?
23 июл 13, 13:58    [14604114]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по выборке из таблицы  [new]
qwerty112
Guest
Прогер_самоучка
Добрый Э - Эх
exists

Пробовал. Пробовал и оператор IN. Либо я неправильно понимаю как их нужно использовать, либо нужно использовать что-то другое.
select  t1.ID,t1.smid,t1.code,t1.price from  tbl_Test as t1
where exists ( select * from tbl_Test as t2 where t1.id=t2.id and t2.code=100 or  t2.code=101)

Опять же, если or, то возвращает абсолютно все записи, если and, то ни одной. Как правильно здесь использовать exists?

что бы результат был такой как в сабжевом посте, так
select  t1.ID,t1.smid,t1.code,t1.price 
from  tbl_Test as t1
where t2.code in (100,101)
and exists ( select * from tbl_Test as t2 where t1.id=t2.id and t2.code=100)
and exists ( select * from tbl_Test as t2 where t1.id=t2.id and t2.code=101)
23 июл 13, 14:02    [14604171]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по выборке из таблицы  [new]
iap
Member

Откуда: Москва
Сообщений: 47107
select  t1.ID,t1.smid,t1.code,t1.price from  tbl_Test as t1
where (select count(distinct t2.code) from tbl_Test as t2 where t1.id=t2.id and t2.code in(100,101))=2;
Или having count(distinct t2.code)= 2 внутри exists
23 июл 13, 14:10    [14604248]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по выборке из таблицы  [new]
Прогер_самоучка
Member

Откуда:
Сообщений: 69023
qwerty112
что бы результат был такой как в сабжевом посте, так
select  t1.ID,t1.smid,t1.code,t1.price 
from  tbl_Test as t1
where t2.code in (100,101)
and exists ( select * from tbl_Test as t2 where t1.id=t2.id and t2.code=100)
and exists ( select * from tbl_Test as t2 where t1.id=t2.id and t2.code=101)

Выдаёт ошибку:
Не удалось привязать составной идентификатор "t2.code"

З.Ы.
Microsoft SQL Server 2008 R2 (SP2) - 10.50.4263.0 (X64) 	
	Aug 23 2012 15:56:56 
	Copyright (c) Microsoft Corporation
	Enterprise Edition (64-bit) on Windows NT 6.0 <X64> (Build 6002: Service Pack 2)
23 июл 13, 14:23    [14604337]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по выборке из таблицы  [new]
мимо
Guest
select *
from tbl_Test  as a 
where exists (	select *
		from (
			select  DENSE_RANK() over (partition by a1.smid order by a1.code) as p
			from  tbl_Test as a1 
			where a1.code in (100,101)
				and a.smid = a1.smid ) as y
		where y.p = 2						
	)
23 июл 13, 14:26    [14604360]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по выборке из таблицы  [new]
iap
Member

Откуда: Москва
Сообщений: 47107
Прогер_самоучка
qwerty112
что бы результат был такой как в сабжевом посте, так
select  t1.ID,t1.smid,t1.code,t1.price 
from  tbl_Test as t1
where t2.code in (100,101)
and exists ( select * from tbl_Test as t2 where t1.id=t2.id and t2.code=100)
and exists ( select * from tbl_Test as t2 where t1.id=t2.id and t2.code=101)


Выдаёт ошибку:
Не удалось привязать составной идентификатор "t2.code"
З.Ы.
Microsoft SQL Server 2008 R2 (SP2) - 10.50.4263.0 (X64) 	
	Aug 23 2012 15:56:56 
	Copyright (c) Microsoft Corporation
	Enterprise Edition (64-bit) on Windows NT 6.0 <X64> (Build 6002: Service Pack 2)
Потому что в основном запросе t2 нет, а в WHERE ошибочно есть.
23 июл 13, 14:26    [14604361]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по выборке из таблицы  [new]
Прогер_самоучка
Member

Откуда:
Сообщений: 69023
iap
[/src]
Потому что в основном запросе t2 нет, а в WHERE ошибочно есть.[/quot]
Да, поменял алиас. Но. Запрос вернул пустоту) Ваш запрос тоже ничего не вернул.
23 июл 13, 14:31    [14604420]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по выборке из таблицы  [new]
iap
Member

Откуда: Москва
Сообщений: 47107
Прогер_самоучка
iap
[/src]
Потому что в основном запросе t2 нет, а в WHERE ошибочно есть.

Да, поменял алиас. Но. Запрос вернул пустоту) Ваш запрос тоже ничего не вернул.[/quote]Потому что связывать надо по smid, а не по id.
select  t1.ID,t1.smid,t1.code,t1.price from  tbl_Test as t1
where (select count(distinct t2.code) from tbl_Test as t2 where t1.smid=t2.smid and t2.code in(100,101))=2;
Ибо id уникально, для него не может быть несколько строк с разными кодами!
23 июл 13, 14:39    [14604468]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по выборке из таблицы  [new]
iap
Member

Откуда: Москва
Сообщений: 47107
Потому что связывать надо по smid, а не по id.
select  t1.ID,t1.smid,t1.code,t1.price from  tbl_Test as t1
where (select count(distinct t2.code) from tbl_Test as t2 where t1.smid=t2.smid and t2.code in(100,101))=2;

Ибо id уникально, для него не может быть несколько строк с разными кодами![/quote]
23 июл 13, 14:40    [14604472]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по выборке из таблицы  [new]
Прогер_самоучка
Member

Откуда:
Сообщений: 69023
мимо
select *
from tbl_Test  as a 
where exists (	select *
		from (
			select  DENSE_RANK() over (partition by a1.smid order by a1.code) as p
			from  tbl_Test as a1 
			where a1.code in (100,101)
				and a.smid = a1.smid ) as y
		where y.p = 2						
	)

То, что нужно. Спасибо огромное. Буду разбираться в вашем решении. Раньше был ms sql 2000. Не припомню ничего похожего в его функциях.
23 июл 13, 14:41    [14604477]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по выборке из таблицы  [new]
Прогер_самоучка
Member

Откуда:
Сообщений: 69023
iap
Потому что связывать надо по smid, а не по id.
select  t1.ID,t1.smid,t1.code,t1.price from  tbl_Test as t1
where (select count(distinct t2.code) from tbl_Test as t2 where t1.smid=t2.smid and t2.code in(100,101))=2;

Ибо id уникально, для него не может быть несколько строк с разными кодами!

Да, вы правы. В таком ключе ваш пример и пример qwerty112 работают.
Премного всем благодарен.
23 июл 13, 14:45    [14604520]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по выборке из таблицы  [new]
Прогер_самоучка
Member

Откуда:
Сообщений: 69023
Тестировал запросы. В IN реализована логика "ИЛИ", следовательно, правильно работает запрос у qwerty112 , потому что там нет IN( если добавить в его список ещё значение, то он выведет все записи, в которых есть первые 2 значения, а не все 3 значения сразу)
26 июл 13, 14:50    [14622313]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по выборке из таблицы  [new]
Прогер_самоучка
Member

Откуда:
Сообщений: 69023
Прогер_самоучка
Тестировал запросы. В IN реализована логика "ИЛИ", следовательно, правильно работает запрос у qwerty112 , потому что там нет IN( если добавить в его список ещё значение, то он выведет все записи, в которых есть первые 2 значения, а не все 3 значения сразу)

Упс. Извиняюсь. Невнимательно тестировал. Все запросы работают правильно.
26 июл 13, 14:54    [14622342]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить