Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 7.7 и ранее

v7: SQLite: можно ли написать подобный запрос без использования временной таблицы?

v7: SQLite: можно ли написать подобный запрос без использования временной таблицы?
Я
   Uberschall
 
08.05.21 - 17:33
CREATE TEMPORARY TABLE newValues(id STRING(36) PRIMARY KEY);
INSERT INTO newValues(id ) VALUES (:ids);
SELECT tmp.id FROM newValues tmp
LEFT JOIN OrderEntity ON tmp.id = OrderEntity.id
WHERE OrderEntity.id IS NULL;
DROP TEMPORARY TABLE tmp_newValues;

есть массив данных- нужно найти значения из массива, для которых отсутствуют данные в БД (связь по id)
   acanta
 
1 - 08.05.21 - 18:58
Теперь все так пишут?
   acanta
 
2 - 08.05.21 - 19:06
Мы добрались до вопроса что такое sqlite
https://m.habr.com/ru/post/149356/
   Salimbek
 
3 - 08.05.21 - 19:19
К автору из (0) вопросы:
1) А для чего нужно именно без временной таблицы?
2) В этом запросе где-то есть 1С-ные таблицы? Или это все "самописка"?
3) Пробовали ли вы метод УложитьТЗ? (Кстати вопрос, ваши данные именно в Массиве? Или вы под этим понимаете СписокЗначений или ТЗ?)
4) Разумеется можно и без временной таблицы, через select id from (select 'v1' as id union all select 'v2' union all ...) as vt Но это гораздо хуже читается
   Uberschall
 
4 - 08.05.21 - 19:42
(3)
1) это связано с фреймворком, который работает с бд. это не 1С
2) в бд существует таблица OrderEntity с колонкой-ключем id и рядом других колонок.
3) вопрос скорее спецам по sqlite, т.к. как я выше написал, обращение к бд осуществляется не из 1С. т.е. методы из 1С нельзя применять
4) представить массив через "select 'v1' as id union all select 'v2' union all ..." не получится, т.к. заранее размер массива не известен.
   Uberschall
 
5 - 08.05.21 - 19:44
(4) 4) + динамически генерировать текст запроса будем думать, что нельзя (хотя надо проверить...)
   Djelf
 
6 - 08.05.21 - 19:54
(4) На форуме sqlite, принято, приводить всю примерную задачу начиная с создания таблиц.
Либо кидать ссылку на таблицу с исходными данными, запросами и т.п.
И обязательно пример того что работает, а что работает как-то не так.
Тут в все в стиле мисты: догадайтесь сами, что у меня там в данных есть, что у меня там в данных нет, что я хочу получить и зачем.
А "найти значения из массива, для которых отсутствуют данные в БД" это можно сделать очень по разному, и скорость будет отличаться в 1000раз и больше!
   Uberschall
 
7 - 08.05.21 - 20:06
(6)
ок, давайте попробую уточнить. дано:
массив со значениями "А", "Б", "В". таблица (в запросе- OrderEntity) с колонкой id с содержимым строк 1. id="А"     2. id="Б"
нужно: составить запрос, который найдет значения из массива, которые отсутствуют в таблице в колонке id.

(3) Salimbek подал мысль с генерируемым запросом через объединение- это одно из решений (проверил- можно динамические запросы использовать).
   Djelf
 
8 - 08.05.21 - 20:07
+(6) Например можно вот так выкрутится. А потом джойнить OrderEntity.id и отбросить лишнее
WITH t(id) AS (
  VALUES (1),(2),(3),(4),(5)
)
SELECT * FROM t;

   Djelf
 
9 - 08.05.21 - 20:11
(7) Посмотри есть ли в том диалекте языка, на котором ты пишешь, поддержка виртуальных таблиц sqlite.
Либо нормальная обертка временных таблиц.
Это все пишется обычно на чистом си - накладные расходы очень малы.
   Uberschall
 
10 - 08.05.21 - 20:11
(8) по сути тоже будет динамический запрос в зависимости от размера массива.

спасибо. попробую оба варианта.
   Djelf
 
11 - 08.05.21 - 20:17
Ну в (8) я загнул, можно и проще
"select T.* from (values (1),(2),(3),(4),(5)) as T;"

   Djelf
 
12 - 08.05.21 - 20:18
Это микросекунды при небольшом объеме...

Список тем форума
 
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.