Форум на Kuban.ru (http://forums.kuban.ru/)
-   Территория 1С (http://forums.kuban.ru/f1040/)
-   -   подскажите по синтаксису (http://forums.kuban.ru/f1040/podskazhite_po_sintaksisu-2940290.html)

LivingStar 15.08.2012 09:18

подскажите по синтаксису
 
ВЫБРАТЬ
Абоненты.Ссылка КАК Абонент
ИЗ
Справочник.Абоненты КАК Абоненты
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Договоры КАК Договоры
ПО Абоненты.Ссылка = Договоры.Владелец
(Договоры.УслугаНаселению В ИЕРАРХИИ(&ВДГО))
И( Договоры.ДатаОкончания > &ТекущаяДата
ИЛИ Договоры.ДатаОкончания = Датавремя(1,1,1))
ГДЕ
Договоры.Ссылка есть NULL

выходит ошибка, как будет правильно?

Текст запроса: Строка 7: **(7,2)**: Синтаксическая ошибка "(Договоры.УслугаНаселению"
<<?>>(Договоры.УслугаНаселению В ИЕРАРХИИ(&ВДГО))

roma n 15.08.2012 09:36

Абоненты.Ссылка=Договоры.Владелец(Договоры.УслугаНаселению В ИЕРАРХИИ(&ВДГО))

Ничего не напрягает?

LivingStar 15.08.2012 09:46

(1) после Владельца нужно И

p etrovich 15.08.2012 13:21

одного меня напрягает это? :)
ГДЕ Договоры.Ссылка есть NULL

roma n 15.08.2012 13:27

3-p etrovich > а что именно напрягает?

hiallbb 15.08.2012 15:18

ПО Абоненты.Ссылка = Договоры.Владелец
И
ГДЕ
Договоры.Ссылка есть NULL
Не будет работать, потому что ссылку имеют все записанные элементы справочников

roma n 15.08.2012 15:33

5-hiallbb > да ну? А ничего, что ГДЕ накладывается на результат соединения?

Maximus 15.08.2012 15:44

вообще бред! я бы сделал :
ВЫБРАТЬ
Договоры.Владелец КАК Абонент,
Договоры.Ссылка КАК Договор,
Договоры.ДатаОкончания
ИЗ Справочник.Договоры как Договоры
ГДЕ (Договоры.УслугаНаселению В ИЕРАРХИИ(&ВДГО)) И (Договоры.ДатаОкончания > &ТекущаяДата
ИЛИ Договоры.ДатаОкончания = Датавремя(1,1,1))

roma n 15.08.2012 15:46

7-Maximus23region > и получил бы строго обратный результат?

hiallbb 15.08.2012 15:53

[quote=hiallbb;26401101] ПО Абоненты.Ссылка = Договоры.Владелец И ГДЕ Договоры.Ссылка есть NULL Не будет работать, потому что ссылку имеют все записанные элементы справочников [/quote]
Сорри, не увидел левого соединения

Maximus 16.08.2012 10:37

надо спросить у автора - что надо получить

Lexusss 16.08.2012 10:53

Все написано очень правильно и грамотно. Не хватает только "И" перед скобками, на которые ругается

Maximus 16.08.2012 14:31

в чем грамота ? если ссылка нул - то соеднять по датам ? датам чего - несуществующего ?

evg77 16.08.2012 15:06

проще через вложенный запрос сделать, имхо.
автор, подскажите, пожалуйста, что нужно получить в результате?

roma n 16.08.2012 15:15

12-Maximus23region > и ты читай (6)
13-evg77 > а зачем вложенный? Потом сделать Не В (РезультатВложенногоЗапроса)? Очень будешь радоваться такой конструкции на наборах данных более-менее приличного оьбъёма

Maximus 16.08.2012 15:45

(14) соедини по датам - явно дата есть у существующей записи БД, какой смысл там где искать пустоту ???

roma n 16.08.2012 15:49

15-Maximus23region > А если подходящей записи для соединения нет?
Задача автора (судя по запросу) прозрачна: получить абонентов, с которыми [b]НЕ[/b] заключено договоров, удовлетворяющих некоторым условиям.

Maximus 16.08.2012 15:52

ага, и отфильтровать в диапазоне дат то чего нет

roma n 16.08.2012 16:17

17-Maximus23region > пипец что в голове у ... !© :)
Ещё раз скажу: см(6)
Сначала цепляем договора слева ко всем абонентам по набору условий. Если ни одного договора не прицепилось, то в результате будет строка - Контрагент|NULL. Именно такие контрагенты и нужны автору: отсюда ГДЕ

Maximus 16.08.2012 16:57

ищем в черной комнате черную кошку по датам ? при условии что ее нет ?

Maximus 16.08.2012 16:59

запрос безусловно отработает, но логика что-то мне на нравится

roma n 16.08.2012 17:02

19-Maximus23region > [b]Устанавливаем[/b], что такой кошки нет.
Выполни в типовой БП в языке запросов простую задачу: отбери всех контрагентов у которых нет договоров с определенной организацией. Авось, получится...

evg77 16.08.2012 17:54

[quote=roma n;26417677] 12-Maximus23region &gt; и ты читай (6) 13-evg77 &gt; а зачем вложенный? Потом сделать Не В (РезультатВложенногоЗапроса)? Очень будешь радоваться такой конструкции на наборах данных более-менее приличного оьбъёма [/quote]

проще в коде потом чужом разбираться. но это сугубо имхо.

Lexusss 16.08.2012 18:01

[quote=roma n;26417677]наборах данных более-менее приличного оьбъёма[/quote]
Оптимизатор SQL транслирует эти конструкции в абсолютно одинаковые планы выполнения. В некоторых случаях конструкция "В..." будет понятнее, в данном случае отлично подходит ЛЕВОЕ СОЕДИНЕНИЕ

evg77 16.08.2012 18:08

(21) ну например вот так:

ВЫБРАТЬ
Контрагенты.Ссылка
ПОМЕСТИТЬ мКонтрагенты
ИЗ
Справочник.Контрагенты КАК Контрагенты
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
ПО Контрагенты.Ссылка = ДоговорыКонтрагентов.Владелец
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Контрагенты.Ссылка
ИЗ
Справочник.Контрагенты КАК Контрагенты
ГДЕ
НЕ Контрагенты.Ссылка В
(ВЫБРАТЬ РАЗЛИЧНЫЕ
мКонтрагенты.Ссылка
ИЗ
мКонтрагенты)
И НЕ Контрагенты.ЭтоГруппа

evg77 16.08.2012 18:12

(24) забыл про организацию. но не суть

roma n 17.08.2012 08:57

23-Lexusss > Возможно. Планы выполнения не смотрел.
В душу "запало" и закостенело давно. Возможно, причина не столько в языковой конструкции, сколько с необходимостью минимизации количества вложенных запросов.
22-evg77 > про читабельность согласен

Lexusss 17.08.2012 09:58

(24) Засунь эту конструкцию себе куда нить.... на 2 пользователей. В нагруженной системе эта хрень будет работать чуть более, чем абсолютно отвратительно, по сравнению с конструкцией в (0).

Maximus 17.08.2012 10:34

(27) с чего бы энто ? разница не в разы, а на проценты чуть проиграет

Lexusss 17.08.2012 11:04

Положим, у меня в базе 100 000 контрагентов, у каждого по 30-50 договоров. Из этого списока контрагентов подпадет под это условие пусть 30.
Подумай теперь, сколько строк будет сгенерировано и обработано в твоей топологии запроса, а сколько - у автора. За одну генерации временной таблицы на тупое перемножении в абсолютном большинстве случаев должен ставиться НЕУД. Бывают, конечно, отдельные случаи работы оптимизатора... но принимать такие решения следует на конкретных данных и показателях статистики.

Maximus 17.08.2012 12:17

(29) запусти на реальной базе с секундомером и увидишь


Текущее время: 22:24. Часовой пояс GMT +3.