Имя: Пароль:
1C
1C 7.7
v7: SQLite: можно ли написать подобный запрос без использования временной таблицы?
0 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)
1 acanta
 
08.05.21
18:58
Теперь все так пишут?
2 acanta
 
08.05.21
19:06
Мы добрались до вопроса что такое sqlite
https://m.habr.com/ru/post/149356/
3 Salimbek
 
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 Но это гораздо хуже читается
4 Uberschall
 
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 ..." не получится, т.к. заранее размер массива не известен.
5 Uberschall
 
08.05.21
19:44
(4) 4) + динамически генерировать текст запроса будем думать, что нельзя (хотя надо проверить...)
6 Djelf
 
08.05.21
19:54
(4) На форуме sqlite, принято, приводить всю примерную задачу начиная с создания таблиц.
Либо кидать ссылку на таблицу с исходными данными, запросами и т.п.
И обязательно пример того что работает, а что работает как-то не так.
Тут в все в стиле мисты: догадайтесь сами, что у меня там в данных есть, что у меня там в данных нет, что я хочу получить и зачем.
А "найти значения из массива, для которых отсутствуют данные в БД" это можно сделать очень по разному, и скорость будет отличаться в 1000раз и больше!
7 Uberschall
 
08.05.21
20:06
(6)
ок, давайте попробую уточнить. дано:
массив со значениями "А", "Б", "В". таблица (в запросе- OrderEntity) с колонкой id с содержимым строк 1. id="А"     2. id="Б"
нужно: составить запрос, который найдет значения из массива, которые отсутствуют в таблице в колонке id.

(3) Salimbek подал мысль с генерируемым запросом через объединение- это одно из решений (проверил- можно динамические запросы использовать).
8 Djelf
 
08.05.21
20:07
+(6) Например можно вот так выкрутится. А потом джойнить OrderEntity.id и отбросить лишнее

WITH t(id) AS (
  VALUES (1),(2),(3),(4),(5)
)
SELECT * FROM t;
9 Djelf
 
08.05.21
20:11
(7) Посмотри есть ли в том диалекте языка, на котором ты пишешь, поддержка виртуальных таблиц sqlite.
Либо нормальная обертка временных таблиц.
Это все пишется обычно на чистом си - накладные расходы очень малы.
10 Uberschall
 
08.05.21
20:11
(8) по сути тоже будет динамический запрос в зависимости от размера массива.

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