|
Почему ГДЕ - зло | ☑ | ||
---|---|---|---|---|
0
neon009
12.05.14
✎
16:47
|
Вот столкнулся с проблемой. Не хотела консоль запросов как и сама система выдавать правильный результат при выборке. А именно, у меня в приходных документах есть только номенклатура "Ручка", а в расходной я пытаюсь списать еще и "Карандаш". Если использовать оператор ГДЕ в запросе то "Карандаша" как будто и вовсе нет. Вот ИБ:
http://webfile.ru/a1f7b0403d32d9daff95c3cd6f41aedf там несколько приходных с "Ручкой" а вот собственно запросы, там параметры поэтому выгружаю в файл: неправильный: http://webfile.ru/d5d6f4a210897d006e3720da3ca7c93f правильный: http://webfile.ru/dd1ad09aecbcd7ad387bfc4f25d94064 Вот не правильный запрос ВЫБРАТЬ РасходнаяТовары.Номенклатура, СУММА(РасходнаяТовары.Количество) КАК КоличествоСпс, СУММА(РасходнаяТовары.Сумма) КАК СуммаСпс, МИНИМУМ(РасходнаяТовары.НомерСтроки) КАК НомерСтроки ПОМЕСТИТЬ ДокТЧ ИЗ Документ.Расходная.Товары КАК РасходнаяТовары ГДЕ НЕ РасходнаяТовары.Номенклатура.Услуга И РасходнаяТовары.Ссылка = &Ссылка СГРУППИРОВАТЬ ПО РасходнаяТовары.Номенклатура ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ * ИЗ Документ.Расходная.Товары КАК РасходнаяТовары ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТоваров.Остатки(&Дата, Номенклатура В (ВЫБРАТЬ ДокТЧ.Номенклатура ИЗ ДокТЧ КАК ДокТЧ) ) КАК ОстаткиТоваровОстатки ПО РасходнаяТовары.Номенклатура = ОстаткиТоваровОстатки.Номенклатура И ОстаткиТоваровОстатки.Партия.Склад=&Склад ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиПоСкладам.Остатки( &Дата, ) КАК ОстаткиПоСкладамОстатки ПО РасходнаяТовары.Номенклатура = ОстаткиПоСкладамОстатки.Номенклатура ГДЕ ОстаткиПоСкладамОстатки.Склад = &Склад Но если убрать ГДЕ ОстаткиПоСкладамОстатки.Склад = &Склад и вместо этого поставить условие как параметр то все отрабатывает на ура ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиПоСкладам.Остатки( &Дата, Склад = &Склад ) КАК ОстаткиПоСкладамОстатки пользуюсь учебной версией |
|||
1
mikecool
12.05.14
✎
16:48
|
результат запроса ровно тот, что просишь, никак не другой...
|
|||
2
Чайник Рассела
12.05.14
✎
16:49
|
народ прямо ринулся качать твой dt
|
|||
3
mikecool
12.05.14
✎
16:49
|
+1 если знаешь как пользоваться, то НЕ ГДЕ = ЗЛО
|
|||
4
ILM
гуру
12.05.14
✎
16:50
|
- Мужик ручка есть?
- Есть, на. - А карандаш? - Неа, - А если найду? |
|||
5
Чайник Рассела
12.05.14
✎
16:50
|
(3) новая нормативно-оценочная категории морального сознания:
добро, зло и ГДЕ. |
|||
6
mikecool
12.05.14
✎
16:52
|
- Студент, трахаться хочешь?
- конечно хочу, но НЕ ГДЕ вот тут точно зло!!! |
|||
7
Господин ПЖ
12.05.14
✎
16:52
|
дело традиционно не в бобине?
|
|||
8
Фокусник
12.05.14
✎
16:52
|
(0)
в данном случае "Склад = &Склад" относится только к таблице РегистрНакопления.ОстаткиПоСкладам.Остатки а "ГДЕ ОстаткиПоСкладамОстатки.Склад = &Склад" ко выборке: Документ.Расходная.Товары которая через ЛЕВОЕ СОЕДИНЕНИЕ соединена с РегистрНакопления.ОстаткиТоваров.Остатки т.е., если на остатках (РегистрНакопления.ОстаткиТоваров.Остатки) нет номенклатуры, то ОстаткиПоСкладамОстатки.Склад = NULL и следовательно эта строка НЕ попадает в выборку... однако это совсем не следует, что "ГДЕ - зло", а только следует только (3)... ;) |
|||
9
salvator
12.05.14
✎
16:53
|
Добро побеждает зло.
Параметр виртуальной таблицы побеждает ГДЕ. |
|||
10
Beduin
12.05.14
✎
16:54
|
(6) СОЕДИНЕНИЕ добро здесь
|
|||
11
Beduin
12.05.14
✎
16:58
|
(8) Кстати разницы нет. В случае ограничения на виртуальную таблицу ты просто сужаешь табличку для объединения, результат должен быть тот же.
|
|||
12
neon009
12.05.14
✎
16:58
|
Вообщем то ГДЕ может и не зло, но в данном случае злит. За коментарии (8)
|
|||
13
1dvd
12.05.14
✎
17:01
|
(9) Бабло побеждает зло. Добро тут не причем
|
|||
14
Enders
12.05.14
✎
17:03
|
(12) Чего злит то? потому что пользоваться не умеешь?)
Данные выбираешь из двух таблиц, а условия ГДЕ используешь на одну, соответственно если в другой таблице нет записей удовлетворяющих условиям(а их нет), то они не попадают в выборку. |
|||
15
Фокусник
12.05.14
✎
17:06
|
(11) " результат должен быть тот же."
Результат не может быть тот же, ведь в выборке (в случае отсутствия записи в правой таблице) ОстаткиПоСкладамОстатки.Склад = NULL а NULL никогда не будет = &Склад ;) |
|||
16
neon009
12.05.14
✎
17:22
|
(14) так там же ЛЕВОЕ СОЕДИНЕНИЕ
|
|||
17
Enders
12.05.14
✎
17:23
|
(11) как это нет?
Пример: Склад; Товар; Расход ; Остаток Склад1; Товар1;Расход1; Null Склад2; Товар2;Расход2; Остаток2; Если наложить условие на таблицу остатков, то записи с NULLом выбраны не будут. Если эти условия прописать в соединении или в вирт таблице, то эти записи попадут в выборку. Условие "Где" отрабатывает уже после соединений, в отличии от условий вирт таблицы(до соединения) или условий соединений(во время). |
|||
18
Enders
12.05.14
✎
17:24
|
(16) и? в (17) понятно или детальней надо?
|
|||
19
neon009
12.05.14
✎
17:25
|
(18) детальнее ...
|
|||
20
neon009
12.05.14
✎
17:26
|
(18) вообщем понял что с вирт.таблицей проблем не будет
|
|||
21
Enders
12.05.14
✎
17:30
|
(19) Хорошо. Пример 2
СкладРасхода; СкладОстатка; НоменРасх; НоменОст; Расх; Ост Склад1; NULL; Товар1; NUll; 1; Null Склад1; Склад1; Товар2; Товар2; 1; 1 Это та таблица, которая у тебя получается после твоего левого соединения расхода с остатком. Далее на эту таблицу ты накладываешь условие: "ГДЕ СкладОстатка = Склад1". Так вот NULL не равно Склад1, соответственно этих записей ты не увидишь. Почему появляется NULL надеюсь объяснять не надо. |
|||
22
neon009
12.05.14
✎
17:34
|
(21) Спасибо за детальную разборку. Теперь понятно
|
|||
23
Леша1с
12.05.14
✎
17:42
|
Вообще не понял, о чем спор. О порядке отбора - где раньше отрабатывает условие, в ВТ или в ГДЕ? О скорости "параметры ВТ против ГДЕ"?
Че-т народ совсем того-этого.... )) |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |