Как в ЗАПРОСЕ или СКД взять первую ВТ_таблицу в результат, если другие несколько пустые?
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(0) может что-то хитрое придумать...
Например, доп таблицу ВТ_2Сгруппированная, где будет только одна записть из ВТ_2
Типа
....
;
ВЫБРАТЬ
Максимум(ВТ_2.Поле1) КАК Поле1
ПОМЕСТИТЬ ВТ_Проверочная
ИЗ ВТ_2 КАК ВТ2
;
ВЫБРАТЬ
ВТ_таблица1.РезЗнач
Из ВТ_таблица1 КАК ВТ_таблица1
ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Проверочная КАК ВТ_Проверочная
ПО ИСТИНА
ГДЕ ВТ_Проверочная.Поле1 ЕСТЬ Null
ОБЪЕДИНИТЬ ВСЕ
ВТ_2.РезЗнач
ИЗ ВТ_2 КАК ВТ_2
ПО ИСТИНА
ГДЕ НЕ ВТ_Проверочная.Поле1 ЕСТЬ Null
Ну это гипотеза, я никогда не делал такого.
По идее, если ВТ_Проверочная пустая, то в первом запросе объединения условие должно Истина быть, во втором - Ложь
Например, доп таблицу ВТ_2Сгруппированная, где будет только одна записть из ВТ_2
Типа
....
;
ВЫБРАТЬ
Максимум(ВТ_2.Поле1) КАК Поле1
ПОМЕСТИТЬ ВТ_Проверочная
ИЗ ВТ_2 КАК ВТ2
;
ВЫБРАТЬ
ВТ_таблица1.РезЗнач
Из ВТ_таблица1 КАК ВТ_таблица1
ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Проверочная КАК ВТ_Проверочная
ПО ИСТИНА
ГДЕ ВТ_Проверочная.Поле1 ЕСТЬ Null
ОБЪЕДИНИТЬ ВСЕ
ВТ_2.РезЗнач
ИЗ ВТ_2 КАК ВТ_2
ПО ИСТИНА
ГДЕ НЕ ВТ_Проверочная.Поле1 ЕСТЬ Null
Ну это гипотеза, я никогда не делал такого.
По идее, если ВТ_Проверочная пустая, то в первом запросе объединения условие должно Истина быть, во втором - Ложь
Для каждой временной таблицы задать номер, определяющий ее приоритет. Далее выяснить номер актуальной ВТ, сгруппировав по номеру таблицы и выбрав первую строку. Отфильтровать все результаты в соответствии с номером актуальной таблицы.
ВЫБРАТЬ
1 КАК НомерТаблицы
// ...
ПОМЕСТИТЬ ВТ1
;
ВЫБРАТЬ
2 КАК НомерТаблицы
// ...
ПОМЕСТИТЬ ВТ2
;
ВЫБРАТЬ
3 КАК НомерТаблицы
// ...
ПОМЕСТИТЬ ВТ3
;
ВЫБРАТЬ * ПОМЕСТИТЬ ВсеРезультаты ИЗ ВТ1
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ * ИЗ ВТ2
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ * ИЗ ВТ3
;
ВЫБРАТЬ ПЕРВЫЕ 1
ВсеРезультаты.НомерТаблицы КАК НомерТаблицы
ПОМЕСТИТЬ НомерАктуальнойТаблицы
ИЗ
ВсеРезультаты КАК ВсеРезультаты
СГРУППИРОВАТЬ ПО
ВсеРезультаты.НомерТаблицы
УПОРЯДОЧИТЬ ПО
НомерТаблицы
;
ВЫБРАТЬ
ВсеРезультаты.*
ИЗ
НомерАктуальнойТаблицы КАК НомерАктуальнойТаблицы
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВсеРезультаты КАК ВсеРезультаты
ПО НомерАктуальнойТаблицы.НомерТаблицы = ВсеРезультаты.НомерТаблицы
Показать
Можно посчитать количество записей в главной таблице, а потом в объединении сделать внутренне соединение по условию на это количество:
Если количествоЗаписей = 0, тогда Истина, а Иначе Ложь. И объединение добавит или все записи из ВТ_ПервыйЗапрос или ни одной.
Весь запрос примера для консоли запросов:
Приведенный выше код выводит данные только из первой временной таблицы.
Для того, чтобы вывелись данные только из второго запроса (ВТ_ВторойЗапрос), надо закомментировать "Первые 0 " из ВТ_ВторойЗапрос.
См. приложенный скрин.
Если количествоЗаписей = 0, тогда Истина, а Иначе Ложь. И объединение добавит или все записи из ВТ_ПервыйЗапрос или ни одной.
...
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ВТ_ПервыйЗапрос.Значение,
ВТ_ПервыйЗапрос.ИмяТаблица
ИЗ
ВТ_ПервыйЗапрос КАК ВТ_ПервыйЗапрос
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_КоличествоЗаписейВторогоЗапроса КАК ВТ_КоличествоЗаписейВторогоЗапроса
ПО (ВЫБОР
КОГДА ВТ_КоличествоЗаписейВторогоЗапроса.КоличествоЗаписейВторогоЗапроса = 0
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ)
ПоказатьВесь запрос примера для консоли запросов:
ВЫБРАТЬ
"ПервыйЗапрос" КАК ИмяТаблица,
1 КАК Значение
ПОМЕСТИТЬ ВТ_ПервыйЗапрос
ОБЪЕДИНИТЬ
ВЫБРАТЬ
"ПервыйЗапрос",
2
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ ПЕРВЫЕ 0
"ВторойЗапрос" КАК ИмяТаблица,
ВТ_ПервыйЗапрос.Значение * 10 КАК Значение
ПОМЕСТИТЬ ВТ_ВторойЗапрос
ИЗ
ВТ_ПервыйЗапрос КАК ВТ_ПервыйЗапрос
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
КОЛИЧЕСТВО(ВТ_ВторойЗапрос.Значение) КАК КоличествоЗаписейВторогоЗапроса
ПОМЕСТИТЬ ВТ_КоличествоЗаписейВторогоЗапроса
ИЗ
ВТ_ВторойЗапрос КАК ВТ_ВторойЗапрос
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
ВТ_ВторойЗапрос.Значение КАК Значение,
ВТ_ВторойЗапрос.ИмяТаблица как ИмяТаблица
ИЗ
ВТ_ВторойЗапрос КАК ВТ_ВторойЗапрос
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ВТ_ПервыйЗапрос.Значение,
ВТ_ПервыйЗапрос.ИмяТаблица
ИЗ
ВТ_ПервыйЗапрос КАК ВТ_ПервыйЗапрос
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_КоличествоЗаписейВторогоЗапроса КАК ВТ_КоличествоЗаписейВторогоЗапроса
ПО (ВЫБОР
КОГДА ВТ_КоличествоЗаписейВторогоЗапроса.КоличествоЗаписейВторогоЗапроса = 0
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ)
ПоказатьПриведенный выше код выводит данные только из первой временной таблицы.
Для того, чтобы вывелись данные только из второго запроса (ВТ_ВторойЗапрос), надо закомментировать "Первые 0 " из ВТ_ВторойЗапрос.
См. приложенный скрин.
Прикрепленные файлы:
Надо в запросах указать поле с номером запроса типа 1 как Номер и тд.
в конце взять и все запросы объединить в один большой через объединение и положить в ВТ, затем сделать запрос к этой ВТ и выбрать Максимум(Номер). таким образом получим последний запрос в котором есть данные. И последним этапом соединить внутренним соединением ВТ и Максимум.
Таким образом будут выбираться строки от последней к первой ТЗ, типа если в 4-й тз пусто то проверяется 3-я и тд
в конце взять и все запросы объединить в один большой через объединение и положить в ВТ, затем сделать запрос к этой ВТ и выбрать Максимум(Номер). таким образом получим последний запрос в котором есть данные. И последним этапом соединить внутренним соединением ВТ и Максимум.
"ВЫБРАТЬ
| РеализацияТоваровУслуг.Ссылка КАК Документ,
| 1 КАК Номер
|ПОМЕСТИТЬ Реализации
|ИЗ
| Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
|;
|
|//////////////////////////////////////////////////////////// ////////////////////
|ВЫБРАТЬ
| ПриобретениеТоваровУслуг.Ссылка КАК Документ,
| 2 КАК Номер
|ПОМЕСТИТЬ Покупки
|ИЗ
| Документ.ПриобретениеТоваровУслуг КАК ПриобретениеТоваровУслуг
|;
|
|//////////////////////////////////////////////////////////// ////////////////////
|ВЫБРАТЬ
| Реализации.Документ КАК Документ,
| Реализации.Номер КАК Номер
|ПОМЕСТИТЬ ВТ
|ИЗ
| Реализации КАК Реализации
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| Покупки.Документ,
| Покупки.Номер
|ИЗ
| Покупки КАК Покупки
|;
|
|//////////////////////////////////////////////////////////// ////////////////////
|ВЫБРАТЬ
| МАКСИМУМ(ВТ.Номер) КАК Номер
|ПОМЕСТИТЬ ВТ_Максимум
|ИЗ
| ВТ КАК ВТ
|;
|
|//////////////////////////////////////////////////////////// ////////////////////
|ВЫБРАТЬ
| ВТ.Документ КАК Документ,
| ВТ.Номер КАК Номер
|ИЗ
| ВТ КАК ВТ
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_Максимум КАК ВТ_Максимум
| ПО ВТ.Номер = ВТ_Максимум.Номер"
ПоказатьТаким образом будут выбираться строки от последней к первой ТЗ, типа если в 4-й тз пусто то проверяется 3-я и тд
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот