К списку форумов К списку тем
Регистрация    Правила    Главная форума    Поиск   
Имя: Пароль:
Рекомендовать в новости

подскажите по синтаксису

Гость
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
Цитата:
Сообщение от hiallbb Посмотреть сообщение
ПО Абоненты.Ссылка = Договоры.Владелец И ГДЕ Договоры.Ссылка есть NULL Не будет работать, потому что ссылку имеют все записанные элементы справочников
Сорри, не увидел левого соединения
Гость
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
Цитата:
Сообщение от roma n Посмотреть сообщение
12-Maximus23region &gt; и ты читай (6) 13-evg77 &gt; а зачем вложенный? Потом сделать Не В (РезультатВложенногоЗапроса)? Очень будешь радоваться такой конструкции на наборах данных более-менее приличного оьбъёма
проще в коде потом чужом разбираться. но это сугубо имхо.
Гость
23 - 16.08.2012 - 18:01
Цитата:
Сообщение от roma n Посмотреть сообщение
наборах данных более-менее приличного оьбъёма
Оптимизатор 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) запусти на реальной базе с секундомером и увидишь


К списку вопросов






Copyright ©, Все права защищены