powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Глупый наверное вопрос, но всё же прошу помочь. Аналог IN для кортежей
11 сообщений из 11, страница 1 из 1
Глупый наверное вопрос, но всё же прошу помочь. Аналог IN для кортежей
    #38404262
Ruban Igor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть таблица: Остатки
Товар, Склад, Партия, Остаток

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

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

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

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

Заранее благодарен за ответ.
...
Рейтинг: 0 / 0
Глупый наверное вопрос, но всё же прошу помочь. Аналог IN для кортежей
    #38404265
qwerty112
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ruban Igor,

а такой запрос, разве не решает задачу сразу, без IN ?
select *
from Остатки where Остаток < 0
...
Рейтинг: 0 / 0
Глупый наверное вопрос, но всё же прошу помочь. Аналог IN для кортежей
    #38404266
qwerty112
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwerty112Ruban Igor,

а такой запрос, разве не решает задачу сразу, без IN ?
select *
from Остатки where Остаток < 0
хотя, может и "не решает", если нужны и полож.остатки, для пар Товар,Склад для которых есть отрицательные
тогда так
Код: sql
1.
2.
3.
select * 
from Остатки a
where exists (select 1 from Остатки b where a.Товар=b.Товар and a.Склад=b.Склад and b.Остаток < 0)
...
Рейтинг: 0 / 0
Глупый наверное вопрос, но всё же прошу помочь. Аналог IN для кортежей
    #38404269
Ruban Igor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwerty112,

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

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

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

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

Вам огромное спасибо! Пойду учить "exists" :)
...
Рейтинг: 0 / 0
Глупый наверное вопрос, но всё же прошу помочь. Аналог IN для кортежей
    #38404329
Гость333
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ruban IgorТовар+Склад

Т.е. ввел составное выражение - ключ.
А кто и как гарантировал, что это ключ?
...
Рейтинг: 0 / 0
Глупый наверное вопрос, но всё же прошу помочь. Аналог IN для кортежей
    #38411275
Ruban Igor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гость333,

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

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

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

Ну и соответственно - наложивши фильтр на "Период" - получаем "Товар"+"Склад"+"Партия" - уникален.
...
Рейтинг: 0 / 0
Глупый наверное вопрос, но всё же прошу помочь. Аналог IN для кортежей
    #38411401
Гость333
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ruban Igor"Товар"+"Склад"+"Партия" - уникален.
Уникальность комбинации значений не гарантирует уникальности конкатенации этих значений.
ТоварСкладAA BBA ABBAAB B
Как видно, все комбинации значений "Товар, Склад" уникальны, в то время как конкатенация Товар+Склад -- нет.
...
Рейтинг: 0 / 0
Глупый наверное вопрос, но всё же прошу помочь. Аналог IN для кортежей
    #38412384
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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 более нагляден.
И, конечно, не понятно, почему все это не отобрать одним запросом. Без предварительного нахождения кортежей.
...
Рейтинг: 0 / 0
Глупый наверное вопрос, но всё же прошу помочь. Аналог IN для кортежей
    #38412394
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Гость333Ruban Igor"Товар"+"Склад"+"Партия" - уникален.
Уникальность комбинации значений не гарантирует уникальности конкатенации этих значений.
ТоварСкладAA BBA ABBAAB B
Как видно, все комбинации значений "Товар, Склад" уникальны, в то время как конкатенация Товар+Склад -- нет.
Именно поэтому такая задача решается введением уникального символа разделителя, заведомо не встречающегося в значениях ( какой нибудь тильды) или комбинации таких символов.
...
Рейтинг: 0 / 0
Глупый наверное вопрос, но всё же прошу помочь. Аналог IN для кортежей
    #38412722
Фотография Shakill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uaggsterГость333пропущено...
Уникальность комбинации значений не гарантирует уникальности конкатенации этих значений.
ТоварСкладAA BBA ABBAAB B
Как видно, все комбинации значений "Товар, Склад" уникальны, в то время как конкатенация Товар+Склад -- нет.
Именно поэтому такая задача решается введением уникального символа разделителя, заведомо не встречающегося в значениях ( какой нибудь тильды) или комбинации таких символов.решение через конкатенацию приводит к тому, что индекс по полям составного ключа не используется, именно поэтому такая задача решается иными способами, уже приведенными в этой теме
...
Рейтинг: 0 / 0
Глупый наверное вопрос, но всё же прошу помочь. Аналог IN для кортежей
    #38413555
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shakill,
Если задача частая, можно добавить в таблицу вычисляемое поле (как раз такую конкатенацию) и сделать по нему индекс.
Кстати, индекс будет использоваться, даже если в запросе указанное поле не будет использовано явно, а будет использовано выражение, аналогичное определению этого самого вычислимого поля.

Нет, я, разумеется, не поклонник такого рода решений. Просто случаи разные бывают. И это вполне себе решение, имеющее право на существование. :-)
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Глупый наверное вопрос, но всё же прошу помочь. Аналог IN для кортежей
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]