![]() |
подскажите по синтаксису ВЫБРАТЬ Абоненты.Ссылка КАК Абонент ИЗ Справочник.Абоненты КАК Абоненты ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Договоры КАК Договоры ПО Абоненты.Ссылка = Договоры.Владелец (Договоры.УслугаНаселению В ИЕРАРХИИ(&ВДГО)) И( Договоры.ДатаОкончания > &ТекущаяДата ИЛИ Договоры.ДатаОкончания = Датавремя(1,1,1)) ГДЕ Договоры.Ссылка есть NULL выходит ошибка, как будет правильно? Текст запроса: Строка 7: **(7,2)**: Синтаксическая ошибка "(Договоры.УслугаНаселению" <<?>>(Договоры.УслугаНаселению В ИЕРАРХИИ(&ВДГО)) |
Абоненты.Ссылка=Договоры.Владелец(Договоры.УслугаНаселению В ИЕРАРХИИ(&ВДГО)) Ничего не напрягает? |
(1) после Владельца нужно И |
одного меня напрягает это? :) ГДЕ Договоры.Ссылка есть NULL |
3-p etrovich > а что именно напрягает? |
ПО Абоненты.Ссылка = Договоры.Владелец И ГДЕ Договоры.Ссылка есть NULL Не будет работать, потому что ссылку имеют все записанные элементы справочников |
5-hiallbb > да ну? А ничего, что ГДЕ накладывается на результат соединения? |
вообще бред! я бы сделал : ВЫБРАТЬ Договоры.Владелец КАК Абонент, Договоры.Ссылка КАК Договор, Договоры.ДатаОкончания ИЗ Справочник.Договоры как Договоры ГДЕ (Договоры.УслугаНаселению В ИЕРАРХИИ(&ВДГО)) И (Договоры.ДатаОкончания > &ТекущаяДата ИЛИ Договоры.ДатаОкончания = Датавремя(1,1,1)) |
7-Maximus23region > и получил бы строго обратный результат? |
[quote=hiallbb;26401101] ПО Абоненты.Ссылка = Договоры.Владелец И ГДЕ Договоры.Ссылка есть NULL Не будет работать, потому что ссылку имеют все записанные элементы справочников [/quote] Сорри, не увидел левого соединения |
надо спросить у автора - что надо получить |
Все написано очень правильно и грамотно. Не хватает только "И" перед скобками, на которые ругается |
в чем грамота ? если ссылка нул - то соеднять по датам ? датам чего - несуществующего ? |
проще через вложенный запрос сделать, имхо. автор, подскажите, пожалуйста, что нужно получить в результате? |
12-Maximus23region > и ты читай (6) 13-evg77 > а зачем вложенный? Потом сделать Не В (РезультатВложенногоЗапроса)? Очень будешь радоваться такой конструкции на наборах данных более-менее приличного оьбъёма |
(14) соедини по датам - явно дата есть у существующей записи БД, какой смысл там где искать пустоту ??? |
15-Maximus23region > А если подходящей записи для соединения нет? Задача автора (судя по запросу) прозрачна: получить абонентов, с которыми [b]НЕ[/b] заключено договоров, удовлетворяющих некоторым условиям. |
ага, и отфильтровать в диапазоне дат то чего нет |
17-Maximus23region > пипец что в голове у ... !© :) Ещё раз скажу: см(6) Сначала цепляем договора слева ко всем абонентам по набору условий. Если ни одного договора не прицепилось, то в результате будет строка - Контрагент|NULL. Именно такие контрагенты и нужны автору: отсюда ГДЕ |
ищем в черной комнате черную кошку по датам ? при условии что ее нет ? |
запрос безусловно отработает, но логика что-то мне на нравится |
19-Maximus23region > [b]Устанавливаем[/b], что такой кошки нет. Выполни в типовой БП в языке запросов простую задачу: отбери всех контрагентов у которых нет договоров с определенной организацией. Авось, получится... |
[quote=roma n;26417677] 12-Maximus23region > и ты читай (6) 13-evg77 > а зачем вложенный? Потом сделать Не В (РезультатВложенногоЗапроса)? Очень будешь радоваться такой конструкции на наборах данных более-менее приличного оьбъёма [/quote] проще в коде потом чужом разбираться. но это сугубо имхо. |
[quote=roma n;26417677]наборах данных более-менее приличного оьбъёма[/quote] Оптимизатор SQL транслирует эти конструкции в абсолютно одинаковые планы выполнения. В некоторых случаях конструкция "В..." будет понятнее, в данном случае отлично подходит ЛЕВОЕ СОЕДИНЕНИЕ |
(21) ну например вот так: ВЫБРАТЬ Контрагенты.Ссылка ПОМЕСТИТЬ мКонтрагенты ИЗ Справочник.Контрагенты КАК Контрагенты ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов ПО Контрагенты.Ссылка = ДоговорыКонтрагентов.Владелец ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ Контрагенты.Ссылка ИЗ Справочник.Контрагенты КАК Контрагенты ГДЕ НЕ Контрагенты.Ссылка В (ВЫБРАТЬ РАЗЛИЧНЫЕ мКонтрагенты.Ссылка ИЗ мКонтрагенты) И НЕ Контрагенты.ЭтоГруппа |
(24) забыл про организацию. но не суть |
23-Lexusss > Возможно. Планы выполнения не смотрел. В душу "запало" и закостенело давно. Возможно, причина не столько в языковой конструкции, сколько с необходимостью минимизации количества вложенных запросов. 22-evg77 > про читабельность согласен |
(24) Засунь эту конструкцию себе куда нить.... на 2 пользователей. В нагруженной системе эта хрень будет работать чуть более, чем абсолютно отвратительно, по сравнению с конструкцией в (0). |
(27) с чего бы энто ? разница не в разы, а на проценты чуть проиграет |
Положим, у меня в базе 100 000 контрагентов, у каждого по 30-50 договоров. Из этого списока контрагентов подпадет под это условие пусть 30. Подумай теперь, сколько строк будет сгенерировано и обработано в твоей топологии запроса, а сколько - у автора. За одну генерации временной таблицы на тупое перемножении в абсолютном большинстве случаев должен ставиться НЕУД. Бывают, конечно, отдельные случаи работы оптимизатора... но принимать такие решения следует на конкретных данных и показателях статистики. |
(29) запусти на реальной базе с секундомером и увидишь |
| Текущее время: 22:24. Часовой пояс GMT +3. |