|
Глупый наверное вопрос, но всё же прошу помочь. Аналог IN для кортежей
|
|||
---|---|---|---|
#18+
Есть таблица: Остатки Товар, Склад, Партия, Остаток Получаю запросом все уникальные сочетания (кортежи) (Товар,Склад), по которым существуют отрицательные остатки: select distinct Товар, Склад from Остатки where Остаток < 0 А теперь нужно выбрать все записи из таблицы "Остатки", у которых (Товар,Склад) попал в результат выполнения первого запроса. Грубо говоря, какой аналог у "IN" не для одного поля, а для кортежа? Заранее благодарен за ответ. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.09.2013, 01:53 |
|
Глупый наверное вопрос, но всё же прошу помочь. Аналог IN для кортежей
|
|||
---|---|---|---|
#18+
Ruban Igor, а такой запрос, разве не решает задачу сразу, без IN ? select * from Остатки where Остаток < 0 ... |
|||
:
Нравится:
Не нравится:
|
|||
23.09.2013, 02:07 |
|
Глупый наверное вопрос, но всё же прошу помочь. Аналог IN для кортежей
|
|||
---|---|---|---|
#18+
qwerty112Ruban Igor, а такой запрос, разве не решает задачу сразу, без IN ? select * from Остатки where Остаток < 0 хотя, может и "не решает", если нужны и полож.остатки, для пар Товар,Склад для которых есть отрицательные тогда так Код: sql 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
23.09.2013, 02:12 |
|
Глупый наверное вопрос, но всё же прошу помочь. Аналог IN для кортежей
|
|||
---|---|---|---|
#18+
qwerty112, Верно, нужны все остатки для найденных пар (Товар,Склад). Задача была срочной, поэтому написал так: select * from Остатки where (Товар+Склад) in ( select distinct Товар+Склад from Остатки where Остаток < 0 ) Т.е. ввел составное выражение - ключ. Понимаю... что моё решение далеко не оптимально. Вам огромное спасибо! Пойду учить "exists" :) ... |
|||
:
Нравится:
Не нравится:
|
|||
23.09.2013, 02:26 |
|
Глупый наверное вопрос, но всё же прошу помочь. Аналог IN для кортежей
|
|||
---|---|---|---|
#18+
Ruban IgorТовар+Склад Т.е. ввел составное выражение - ключ. А кто и как гарантировал, что это ключ? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.09.2013, 09:29 |
|
Глупый наверное вопрос, но всё же прошу помочь. Аналог IN для кортежей
|
|||
---|---|---|---|
#18+
Гость333, Гарантировала фирма 1С. Таблица "Остатки" - это таблица остатков по регистру (на платформе 7.7). Если измерения регистра только: "Товар", "Склад", "Партия" То таблица остатков всегда следующего формата: "Период", "Товар", "Склад", "Партия", "Остаток" Причем - составной ключ "Период"+"Товар"+"Склад"+"Партия" - уникален. Ну и соответственно - наложивши фильтр на "Период" - получаем "Товар"+"Склад"+"Партия" - уникален. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2013, 23:46 |
|
Глупый наверное вопрос, но всё же прошу помочь. Аналог IN для кортежей
|
|||
---|---|---|---|
#18+
Ruban Igor"Товар"+"Склад"+"Партия" - уникален. Уникальность комбинации значений не гарантирует уникальности конкатенации этих значений. ТоварСкладAA BBA ABBAAB B Как видно, все комбинации значений "Товар, Склад" уникальны, в то время как конкатенация Товар+Склад -- нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2013, 09:39 |
|
Глупый наверное вопрос, но всё же прошу помочь. Аналог IN для кортежей
|
|||
---|---|---|---|
#18+
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.09.2013, 22:08 |
|
Глупый наверное вопрос, но всё же прошу помочь. Аналог IN для кортежей
|
|||
---|---|---|---|
#18+
Гость333Ruban Igor"Товар"+"Склад"+"Партия" - уникален. Уникальность комбинации значений не гарантирует уникальности конкатенации этих значений. ТоварСкладAA BBA ABBAAB B Как видно, все комбинации значений "Товар, Склад" уникальны, в то время как конкатенация Товар+Склад -- нет. Именно поэтому такая задача решается введением уникального символа разделителя, заведомо не встречающегося в значениях ( какой нибудь тильды) или комбинации таких символов. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2013, 22:17 |
|
Глупый наверное вопрос, но всё же прошу помочь. Аналог IN для кортежей
|
|||
---|---|---|---|
#18+
uaggsterГость333пропущено... Уникальность комбинации значений не гарантирует уникальности конкатенации этих значений. ТоварСкладAA BBA ABBAAB B Как видно, все комбинации значений "Товар, Склад" уникальны, в то время как конкатенация Товар+Склад -- нет. Именно поэтому такая задача решается введением уникального символа разделителя, заведомо не встречающегося в значениях ( какой нибудь тильды) или комбинации таких символов.решение через конкатенацию приводит к тому, что индекс по полям составного ключа не используется, именно поэтому такая задача решается иными способами, уже приведенными в этой теме ... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2013, 11:11 |
|
Глупый наверное вопрос, но всё же прошу помочь. Аналог IN для кортежей
|
|||
---|---|---|---|
#18+
Shakill, Если задача частая, можно добавить в таблицу вычисляемое поле (как раз такую конкатенацию) и сделать по нему индекс. Кстати, индекс будет использоваться, даже если в запросе указанное поле не будет использовано явно, а будет использовано выражение, аналогичное определению этого самого вычислимого поля. Нет, я, разумеется, не поклонник такого рода решений. Просто случаи разные бывают. И это вполне себе решение, имеющее право на существование. :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2013, 19:51 |
|
|
start [/forum/topic.php?fid=46&gotonew=1&tid=1705138]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
64ms |
get topic data: |
13ms |
get first new msg: |
8ms |
get forum data: |
3ms |
get page messages: |
58ms |
get tp. blocked users: |
2ms |
others: | 242ms |
total: | 422ms |
0 / 0 |