0
- 15.08.2012 - 09:18
|
ВЫБРАТЬ Абоненты.Ссылка КАК Абонент ИЗ Справочник.Абоненты КАК Абоненты ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Договоры КАК Договоры ПО Абоненты.Ссылка = Договоры.Владелец (Договоры.УслугаНаселению В ИЕРАРХИИ(&ВДГО)) И( Договоры.ДатаОкончания > &ТекущаяДата ИЛИ Договоры.ДатаОкончания = Датавремя(1,1,1)) ГДЕ Договоры.Ссылка есть NULL выходит ошибка, как будет правильно? Текст запроса: Строка 7: **(7,2)**: Синтаксическая ошибка "(Договоры.УслугаНаселению" <<?>>(Договоры.УслугаНаселению В ИЕРАРХИИ(&ВДГО)) | |
1
- 15.08.2012 - 09:36
|
Абоненты.Ссылка=Договоры.Владелец(Договоры.УслугаН аселению В ИЕРАРХИИ(&ВДГО)) Ничего не напрягает? | |
2
- 15.08.2012 - 09:46
| (1) после Владельца нужно И | |
3
- 15.08.2012 - 13:21
|
одного меня напрягает это? :) ГДЕ Договоры.Ссылка есть NULL | |
4
- 15.08.2012 - 13:27
| 3-p etrovich > а что именно напрягает? | |
5
- 15.08.2012 - 15:18
|
ПО Абоненты.Ссылка = Договоры.Владелец И ГДЕ Договоры.Ссылка есть NULL Не будет работать, потому что ссылку имеют все записанные элементы справочников | |
6
- 15.08.2012 - 15:33
| 5-hiallbb > да ну? А ничего, что ГДЕ накладывается на результат соединения? | |
7
- 15.08.2012 - 15:44
|
вообще бред! я бы сделал : ВЫБРАТЬ Договоры.Владелец КАК Абонент, Договоры.Ссылка КАК Договор, Договоры.ДатаОкончания ИЗ Справочник.Договоры как Договоры ГДЕ (Договоры.УслугаНаселению В ИЕРАРХИИ(&ВДГО)) И (Договоры.ДатаОкончания > &ТекущаяДата ИЛИ Договоры.ДатаОкончания = Датавремя(1,1,1)) | |
8
- 15.08.2012 - 15:46
| 7-Maximus23region > и получил бы строго обратный результат? | |
9
- 15.08.2012 - 15:53
| Сорри, не увидел левого соединения | |
10
- 16.08.2012 - 10:37
| надо спросить у автора - что надо получить | |
11
- 16.08.2012 - 10:53
| Все написано очень правильно и грамотно. Не хватает только "И" перед скобками, на которые ругается | |
12
- 16.08.2012 - 14:31
| в чем грамота ? если ссылка нул - то соеднять по датам ? датам чего - несуществующего ? | |
13
- 16.08.2012 - 15:06
|
проще через вложенный запрос сделать, имхо. автор, подскажите, пожалуйста, что нужно получить в результате? | |
14
- 16.08.2012 - 15:15
|
12-Maximus23region > и ты читай (6) 13-evg77 > а зачем вложенный? Потом сделать Не В (РезультатВложенногоЗапроса)? Очень будешь радоваться такой конструкции на наборах данных более-менее приличного оьбъёма | |
15
- 16.08.2012 - 15:45
| (14) соедини по датам - явно дата есть у существующей записи БД, какой смысл там где искать пустоту ??? | |
16
- 16.08.2012 - 15:49
|
15-Maximus23region > А если подходящей записи для соединения нет? Задача автора (судя по запросу) прозрачна: получить абонентов, с которыми НЕ заключено договоров, удовлетворяющих некоторым условиям. | |
17
- 16.08.2012 - 15:52
| ага, и отфильтровать в диапазоне дат то чего нет | |
18
- 16.08.2012 - 16:17
|
17-Maximus23region > пипец что в голове у ... !© :) Ещё раз скажу: см(6) Сначала цепляем договора слева ко всем абонентам по набору условий. Если ни одного договора не прицепилось, то в результате будет строка - Контрагент|NULL. Именно такие контрагенты и нужны автору: отсюда ГДЕ | |
19
- 16.08.2012 - 16:57
| ищем в черной комнате черную кошку по датам ? при условии что ее нет ? | |
20
- 16.08.2012 - 16:59
| запрос безусловно отработает, но логика что-то мне на нравится | |
21
- 16.08.2012 - 17:02
|
19-Maximus23region > Устанавливаем, что такой кошки нет. Выполни в типовой БП в языке запросов простую задачу: отбери всех контрагентов у которых нет договоров с определенной организацией. Авось, получится... | |
22
- 16.08.2012 - 17:54
| проще в коде потом чужом разбираться. но это сугубо имхо. | |
23
- 16.08.2012 - 18:01
| Оптимизатор SQL транслирует эти конструкции в абсолютно одинаковые планы выполнения. В некоторых случаях конструкция "В..." будет понятнее, в данном случае отлично подходит ЛЕВОЕ СОЕДИНЕНИЕ | |
24
- 16.08.2012 - 18:08
|
(21) ну например вот так: ВЫБРАТЬ Контрагенты.Ссылка ПОМЕСТИТЬ мКонтрагенты ИЗ Справочник.Контрагенты КАК Контрагенты ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов ПО Контрагенты.Ссылка = ДоговорыКонтрагентов.Владелец ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ Контрагенты.Ссылка ИЗ Справочник.Контрагенты КАК Контрагенты ГДЕ НЕ Контрагенты.Ссылка В (ВЫБРАТЬ РАЗЛИЧНЫЕ мКонтрагенты.Ссылка ИЗ мКонтрагенты) И НЕ Контрагенты.ЭтоГруппа | |
25
- 16.08.2012 - 18:12
| (24) забыл про организацию. но не суть | |
26
- 17.08.2012 - 08:57
|
23-Lexusss > Возможно. Планы выполнения не смотрел. В душу "запало" и закостенело давно. Возможно, причина не столько в языковой конструкции, сколько с необходимостью минимизации количества вложенных запросов. 22-evg77 > про читабельность согласен | |
27
- 17.08.2012 - 09:58
| (24) Засунь эту конструкцию себе куда нить.... на 2 пользователей. В нагруженной системе эта хрень будет работать чуть более, чем абсолютно отвратительно, по сравнению с конструкцией в (0). | |
28
- 17.08.2012 - 10:34
| (27) с чего бы энто ? разница не в разы, а на проценты чуть проиграет | |
29
- 17.08.2012 - 11:04
|
Положим, у меня в базе 100 000 контрагентов, у каждого по 30-50 договоров. Из этого списока контрагентов подпадет под это условие пусть 30. Подумай теперь, сколько строк будет сгенерировано и обработано в твоей топологии запроса, а сколько - у автора. За одну генерации временной таблицы на тупое перемножении в абсолютном большинстве случаев должен ставиться НЕУД. Бывают, конечно, отдельные случаи работы оптимизатора... но принимать такие решения следует на конкретных данных и показателях статистики. | |
30
- 17.08.2012 - 12:17
| (29) запусти на реальной базе с секундомером и увидишь | |
| Интернет-форум Краснодарского края и Краснодара |