|
Проблема с запросом, два внутренних соединения | ☑ | ||
---|---|---|---|---|
0
LLIaMaH
08.04.15
✎
06:22
|
Простенькая конфа по учету показания счетчиков. Пакетным запросом выбираю показания за текущий месяц и за предидущий. Потом в запросе делаю внутреннее соединение с этими двумя таблицами, необходиом получить в выборке только те счетчики по которым есть показания либо в текущем периоде либо в прошлом периоде. Есть два счетчика которые не имеют показаний в прошлом периоде, по какото причине они не попадают в выборку, видимо чето я не догоню в работе механизма соединений таблиц, особенно когда их последовательно два. Если пробовать с каждой ВТ соединять по отдельности то все отрабатывает как положено.
ВЫБРАТЬ ПоказанияСчетчиков.Счетчик.Ссылка как Счетчик, ПоказанияСчетчиков.Показание ПОМЕСТИТЬ ПоказанияПрошлогоПериода ИЗ РегистрСведений.ПоказанияСчетчиков КАК ПоказанияСчетчиков ГДЕ ПоказанияСчетчиков.Период = &ДатаОстатков1 ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ПоказанияСчетчиков.Счетчик.Ссылка как Счетчик, ПоказанияСчетчиков.Показание ПОМЕСТИТЬ ПоказанияТекущегоПериода ИЗ РегистрСведений.ПоказанияСчетчиков КАК ПоказанияСчетчиков ГДЕ ПоказанияСчетчиков.Период = &ДатаОстатков ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ Счетчики.Ссылка КАК Счетчик, ПоказанияПрошлогоПериода.Показание КАК ПоказаниеПрошлогоПериода, ПоказанияТекущегоПериода.Показание КАК ПоказаниеТекущегоПериода ИЗ Справочник.Счетчики КАК Счетчики внутреннее СОЕДИНЕНИЕ ПоказанияТекущегоПериода КАК ПоказанияТекущегоПериода ПО Счетчики.Ссылка = ПоказанияТекущегоПериода.Счетчик внутреннее СОЕДИНЕНИЕ ПоказанияПрошлогоПериода КАК ПоказанияПрошлогоПериода ПО Счетчики.Ссылка = ПоказанияПрошлогоПериода.Счетчик |
|||
1
LLIaMaH
08.04.15
✎
06:25
|
А вот выборка с временными таблицам, видно что в одной есть счетчики СЭТ4-1/2 №019162 СЭТ4-1/2 №019164 которые по какото причине не попадают в итоговую выборку.
Временная таблица: ПоказанияПрошлогоПериода (Записей в результате: 6) Счетчик Показание Меркурий 230 №13107265 300 СЕ 303 №812023087 100 ЦЭ 68038 № ... 200 Нева 303 1SO №682810 985 Меркурий 230 №03920533 500 Нева 301 1SO №012586 5 000 Временная таблица: ПоказанияТекущегоПериода (Записей в результате: 8) Счетчик Показание Меркурий 230 №13107265 600 СЕ 303 №812023087 990 ЦЭ 68038 № ... 1 000 СЭТ4-1/2 №019162 800 СЭТ4-1/2 №019164 700 Нева 303 1SO №682810 1 500 Меркурий 230 №03920533 1 000 Нева 301 1SO №012586 8 000 Запрос: Справочник.Счетчики (Записей в результате: 6) Счетчик ПоказаниеПрошлогоПериода ПоказаниеТекущегоПериода Меркурий 230 №13107265 300 600 СЕ 303 №812023087 100 990 ЦЭ 68038 № ... 200 1 000 Нева 303 1SO №682810 985 1 500 Меркурий 230 №03920533 500 1 000 Нева 301 1SO №012586 5 000 8 000 |
|||
2
SeraFim
08.04.15
✎
06:31
|
внутреннее соединение - это когда записи, удовлетворяющие условию есть в обеих таблицах.
Тебе нужно ЛЕВОЕ соединение и условие, что есть показания либо в текущем периоде либо в прошлом периоде. |
|||
3
Dilgorp
08.04.15
✎
06:32
|
(0) по твоему запросу должны попадать только счетчики, которые есть во всех трех таблицах одновременно, не знаю насколько правильно и быстро, но должно сработать:
ВЫБРАТЬ Счетчики.Ссылка КАК Счетчик, ПоказанияПрошлогоПериода.Показание КАК ПоказаниеПрошлогоПериода, ПоказанияТекущегоПериода.Показание КАК ПоказаниеТекущегоПериода ИЗ Справочник.Счетчики КАК Счетчики ЛЕВОЕ СОЕДИНЕНИЕ ПоказанияТекущегоПериода КАК ПоказанияТекущегоПериода ПО Счетчики.Ссылка = ПоказанияТекущегоПериода.Счетчик ЛЕВОЕ СОЕДИНЕНИЕ ПоказанияПрошлогоПериода КАК ПоказанияПрошлогоПериода ПО Счетчики.Ссылка = ПоказанияПрошлогоПериода.Счетчик ГДЕ НЕ (ПоказанияПрошлогоПериода.Показание IS NULL И ПоказанияТекущегоПериода.Показание IS NULL) |
|||
4
LLIaMaH
08.04.15
✎
06:51
|
Во как. Я думал что внетренее соединение работает только для двух таблиц, и в итоговую выборку попадают все записи из таблиц каждого соединения. Левое соединение не подходит, тогда попадет весь справочник счетчиков, а использовать где наверно не оптимально, хотя я вот выриант накидал не то чтобы он был более оптимален, вроде работает как нада.
ВЫБРАТЬ ПоказанияСчетчиков.Счетчик.Ссылка КАК Счетчик, ПоказанияСчетчиков.Показание ПОМЕСТИТЬ ПоказанияПрошлогоПериода ИЗ РегистрСведений.ПоказанияСчетчиков КАК ПоказанияСчетчиков ГДЕ ПоказанияСчетчиков.Период = &ДатаОстатков1 ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ПоказанияСчетчиков.Счетчик.Ссылка КАК Счетчик, ПоказанияСчетчиков.Показание ПОМЕСТИТЬ ПоказанияТекущегоПериода ИЗ РегистрСведений.ПоказанияСчетчиков КАК ПоказанияСчетчиков ГДЕ ПоказанияСчетчиков.Период = &ДатаОстатков ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ Счетчики.Ссылка КАК Счетчик, ПоказанияПрошлогоПериода.Показание КАК ПоказаниеПрошлогоПериода, 0 КАК ПоказанияТекущегоПериода ПОМЕСТИТЬ Общая ИЗ Справочник.Счетчики КАК Счетчики ВНУТРЕННЕЕ СОЕДИНЕНИЕ ПоказанияПрошлогоПериода КАК ПоказанияПрошлогоПериода ПО Счетчики.Ссылка = ПоказанияПрошлогоПериода.Счетчик ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ Счетчики.Ссылка, 0, ПоказанияТекущегоПериода.Показание ИЗ Справочник.Счетчики КАК Счетчики ВНУТРЕННЕЕ СОЕДИНЕНИЕ ПоказанияТекущегоПериода КАК ПоказанияТекущегоПериода ПО Счетчики.Ссылка = ПоказанияТекущегоПериода.Счетчик ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ Общая.Счетчик, СУММА(Общая.ПоказаниеПрошлогоПериода) КАК ПоказаниеПрошлогоПериода, СУММА(Общая.ПоказанияТекущегоПериода) КАК ПоказанияТекущегоПериода ИЗ Общая КАК Общая СГРУППИРОВАТЬ ПО Общая.Счетчик |
|||
5
LLIaMaH
08.04.15
✎
06:58
|
+4 хотя на кой в этом случае было делать ВТ по регистрам отдельно, так прикольней
//////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ Счетчики.Ссылка КАК Счетчик, ПоказанияПрошлогоПериода.Показание КАК ПоказаниеПрошлогоПериода, 0 КАК ПоказанияТекущегоПериода ПОМЕСТИТЬ Общая ИЗ Справочник.Счетчики КАК Счетчики ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ПоказанияСчетчиков КАК ПоказанияПрошлогоПериода ПО Счетчики.Ссылка = ПоказанияПрошлогоПериода.Счетчик ГДЕ ПоказанияПрошлогоПериода.Период = &ДатаОстатков1 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ Счетчики.Ссылка, 0, ПоказанияТекущегоПериода.Показание ИЗ Справочник.Счетчики КАК Счетчики ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ПоказанияСчетчиков КАК ПоказанияТекущегоПериода ПО Счетчики.Ссылка = ПоказанияТекущегоПериода.Счетчик ГДЕ ПоказанияТекущегоПериода.Период = &ДатаОстатков ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ Общая.Счетчик, СУММА(Общая.ПоказаниеПрошлогоПериода) КАК ПоказаниеПрошлогоПериода, СУММА(Общая.ПоказанияТекущегоПериода) КАК ПоказанияТекущегоПериода ИЗ Общая КАК Общая СГРУППИРОВАТЬ ПО Общая.Счетчик |
|||
6
Dilgorp
08.04.15
✎
07:00
|
(4) не проще ли тогда так:
ВЫБРАТЬ ПоказанияСчетчиков.Счетчик КАК Счетчик, 0 КАК ПоказаниеПрошлогоПериода, ПоказанияСчетчиков.Показание КАК ПоказаниеТекущегоПериода ИЗ РегистрСведений.ПоказанияСчетчиков КАК ПоказанияСчетчиков ГДЕ ПоказанияСчетчиков.Период = &ДатаОстатков1 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ПоказанияСчетчиков.Счетчик, ПоказанияСчетчиков.Показание, 0 ИЗ РегистрСведений.ПоказанияСчетчиков КАК ПоказанияСчетчиков ГДЕ ПоказанияСчетчиков.Период = &ДатаОстатков |
|||
7
Dilgorp
08.04.15
✎
07:00
|
(6) + без ВТ и всего прочего
|
|||
8
Dilgorp
08.04.15
✎
07:02
|
(5) зачем соединение со справочником?
|
|||
9
LLIaMaH
08.04.15
✎
07:13
|
(8) Начитался статей и книжек по запросам. Выборку с ОБЪЕДИНИТЬ все равно нада оборачивать во вложенный запрос или выносить во временную таблицу, чтобы потом сгруппировать по Счетчику, вроде как пишут что в свете новых использовать вложенные запросы не феншуйно.
Про соединение со счетчиком, запрос я привел в сокращенном варианте, в полном еще отдельно получаются реквизиты справочника Счетчик и группируются по ним, начитавшись все техже книжек про оптимизацию запросов для СКУля, старался писать оптимально, потому что так или иначе в дальнешем скуль всеравно сделает это соединение, на скока оптимально ХЗ. ну и вроде как через несколько точек вытягивать реквизиты тоже неправильно. |
|||
10
Dilgorp
08.04.15
✎
07:16
|
(9) спасибо за информацию)))
|
|||
11
Simod
08.04.15
✎
07:43
|
ВЫБРАТЬ
1 КАК Счетчик, 10 КАК Показание ПОМЕСТИТЬ ПрошлыйМесяц ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 2, 20 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 1, NULL ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ 2 КАК Счетчик, 10 КАК Показание ПОМЕСТИТЬ ТекущийМесяц ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 2, 20 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 2, NULL ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ПрошлыйМесяц.Счетчик, ПрошлыйМесяц.Показание, ТекущийМесяц.Счетчик КАК Счетчик1, ТекущийМесяц.Показание КАК Показание1 ИЗ ПрошлыйМесяц КАК ПрошлыйМесяц ЛЕВОЕ СОЕДИНЕНИЕ ТекущийМесяц КАК ТекущийМесяц ПО ПрошлыйМесяц.Счетчик = ТекущийМесяц.Счетчик ГДЕ (НЕ ПрошлыйМесяц.Показание ЕСТЬ NULL ИЛИ НЕ ТекущийМесяц.Показание ЕСТЬ NULL ) |
|||
12
D_E_S_131
08.04.15
✎
09:57
|
(9) "что в свете новых использовать вложенные запросы не феншуйно" — это Вы просто книжки с помощью скорочтения по диагонали читаете.
|
|||
13
LLIaMaH
08.04.15
✎
13:31
|
(12) А ВЫ вдумчево и сверху вниз? Почему бы сразу не аргументирова толком, без словесного поноса :) Это скорее собирательное мое мнение из разных источников, ну и по логике я так считаю, что если можно вынести вложеный запрос во временную таблицу, хотябы ради улучшения восприятия текста и упрощения отладки, то почему бы это не сделать.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |