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

Откуда: Киев
Сообщений: 235
Есть таблица: Остатки
Товар, Склад, Партия, Остаток

Получаю запросом все уникальные сочетания (кортежи) (Товар,Склад), по которым существуют отрицательные остатки:

select distinct Товар, Склад
from Остатки where Остаток < 0

А теперь нужно выбрать все записи из таблицы "Остатки", у которых (Товар,Склад) попал в результат выполнения первого запроса.

Грубо говоря, какой аналог у "IN" не для одного поля, а для кортежа?

Заранее благодарен за ответ.
23 сен 13, 01:53    [14870489]     Ответить | Цитировать Сообщить модератору
 Re: Глупый наверное вопрос, но всё же прошу помочь. Аналог IN для кортежей  [new]
qwerty112
Guest
Ruban Igor,

а такой запрос, разве не решает задачу сразу, без IN ?
select *
from Остатки where Остаток < 0
23 сен 13, 02:07    [14870503]     Ответить | Цитировать Сообщить модератору
 Re: Глупый наверное вопрос, но всё же прошу помочь. Аналог IN для кортежей  [new]
qwerty112
Guest
qwerty112
Ruban Igor,

а такой запрос, разве не решает задачу сразу, без IN ?
select *
from Остатки where Остаток < 0

хотя, может и "не решает", если нужны и полож.остатки, для пар Товар,Склад для которых есть отрицательные
тогда так
select * 
from Остатки a
where exists (select 1 from Остатки b where a.Товар=b.Товар and a.Склад=b.Склад and b.Остаток < 0)
23 сен 13, 02:12    [14870505]     Ответить | Цитировать Сообщить модератору
 Re: Глупый наверное вопрос, но всё же прошу помочь. Аналог IN для кортежей  [new]
Ruban Igor
Member

Откуда: Киев
Сообщений: 235
qwerty112,

Верно, нужны все остатки для найденных пар (Товар,Склад).

Задача была срочной, поэтому написал так:

select *
from Остатки
where (Товар+Склад) in
(
select distinct Товар+Склад
from Остатки where Остаток < 0
)

Т.е. ввел составное выражение - ключ.
Понимаю... что моё решение далеко не оптимально.

Вам огромное спасибо! Пойду учить "exists" :)
23 сен 13, 02:26    [14870512]     Ответить | Цитировать Сообщить модератору
 Re: Глупый наверное вопрос, но всё же прошу помочь. Аналог IN для кортежей  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Ruban Igor
Товар+Склад

Т.е. ввел составное выражение - ключ.

А кто и как гарантировал, что это ключ?
23 сен 13, 09:29    [14870772]     Ответить | Цитировать Сообщить модератору
 Re: Глупый наверное вопрос, но всё же прошу помочь. Аналог IN для кортежей  [new]
Ruban Igor
Member

Откуда: Киев
Сообщений: 235
Гость333,

Гарантировала фирма 1С.
Таблица "Остатки" - это таблица остатков по регистру (на платформе 7.7).
Если измерения регистра только: "Товар", "Склад", "Партия"

То таблица остатков всегда следующего формата:
"Период", "Товар", "Склад", "Партия", "Остаток"

Причем - составной ключ "Период"+"Товар"+"Склад"+"Партия" - уникален.

Ну и соответственно - наложивши фильтр на "Период" - получаем "Товар"+"Склад"+"Партия" - уникален.
29 сен 13, 23:46    [14899305]     Ответить | Цитировать Сообщить модератору
 Re: Глупый наверное вопрос, но всё же прошу помочь. Аналог IN для кортежей  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Ruban Igor
"Товар"+"Склад"+"Партия" - уникален.

Уникальность комбинации значений не гарантирует уникальности конкатенации этих значений.
ТоварСклад
AA BB
A ABB
AAB B

Как видно, все комбинации значений "Товар, Склад" уникальны, в то время как конкатенация Товар+Склад -- нет.
30 сен 13, 09:39    [14899765]     Ответить | Цитировать Сообщить модератору
 Re: Глупый наверное вопрос, но всё же прошу помочь. Аналог IN для кортежей  [new]
uaggster
Member

Откуда:
Сообщений: 1068
Ruban Igor
Есть таблица: Остатки
Товар, Склад, Партия, Остаток

Получаю запросом все уникальные сочетания (кортежи) (Товар,Склад), по которым существуют отрицательные остатки:

select distinct Товар, Склад
from Остатки where Остаток < 0

А теперь нужно выбрать все записи из таблицы "Остатки", у которых (Товар,Склад) попал в результат выполнения первого запроса.

Грубо говоря, какой аналог у "IN" не для одного поля, а для кортежа?

Заранее благодарен за ответ.


Примерно так:
Select a.* from [Остатки] a
Inner join (select distinct Товар, Склад
from Остатки where Остаток < 0) b on
a.Товар=b.Товар and a.Склад=b.Склад

Select * from [Остатки] a
Cross apply (select distinct 1
from Остатки b where b.Остаток < 0 and a.Товар=b.Товар and a.Склад=b.Склад) t

Хотя, безусловно, классический вариант с exists более нагляден.
И, конечно, не понятно, почему все это не отобрать одним запросом. Без предварительного нахождения кортежей.
30 сен 13, 22:08    [14903988]     Ответить | Цитировать Сообщить модератору
 Re: Глупый наверное вопрос, но всё же прошу помочь. Аналог IN для кортежей  [new]
uaggster
Member

Откуда:
Сообщений: 1068
Гость333
Ruban Igor
"Товар"+"Склад"+"Партия" - уникален.

Уникальность комбинации значений не гарантирует уникальности конкатенации этих значений.
ТоварСклад
AA BB
A ABB
AAB B

Как видно, все комбинации значений "Товар, Склад" уникальны, в то время как конкатенация Товар+Склад -- нет.

Именно поэтому такая задача решается введением уникального символа разделителя, заведомо не встречающегося в значениях ( какой нибудь тильды) или комбинации таких символов.
30 сен 13, 22:17    [14904006]     Ответить | Цитировать Сообщить модератору
 Re: Глупый наверное вопрос, но всё же прошу помочь. Аналог IN для кортежей  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
uaggster
Гость333
пропущено...
Уникальность комбинации значений не гарантирует уникальности конкатенации этих значений.
ТоварСклад
AA BB
A ABB
AAB B

Как видно, все комбинации значений "Товар, Склад" уникальны, в то время как конкатенация Товар+Склад -- нет.

Именно поэтому такая задача решается введением уникального символа разделителя, заведомо не встречающегося в значениях ( какой нибудь тильды) или комбинации таких символов.
решение через конкатенацию приводит к тому, что индекс по полям составного ключа не используется, именно поэтому такая задача решается иными способами, уже приведенными в этой теме
1 окт 13, 11:11    [14905376]     Ответить | Цитировать Сообщить модератору
 Re: Глупый наверное вопрос, но всё же прошу помочь. Аналог IN для кортежей  [new]
uaggster
Member

Откуда:
Сообщений: 1068
Shakill,
Если задача частая, можно добавить в таблицу вычисляемое поле (как раз такую конкатенацию) и сделать по нему индекс.
Кстати, индекс будет использоваться, даже если в запросе указанное поле не будет использовано явно, а будет использовано выражение, аналогичное определению этого самого вычислимого поля.

Нет, я, разумеется, не поклонник такого рода решений. Просто случаи разные бывают. И это вполне себе решение, имеющее право на существование. :-)
1 окт 13, 19:51    [14909116]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить