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