#sqlite
#sqlite
Вопрос:
У меня есть две базы данных sqlite3, в которых есть таблицы с идентичными схемами и (возможно) перекрывающимися данными. Например Temperature
, таблица в обеих базах данных. Если я хочу объединить все столбцы из обеих таблиц, я сначала ATTACH
использую другую базу данных:
sqlite> ATTACH DATABASE 'old.sqlite' AS Old;
а затем объедините их UNION
следующим образом:
sqlite> SELECT * FROM Temperature UNION SELECT * FROM Old.Temperature;
Это работает нормально.
Однако иногда существует только одна таблица. Например, для влажности у меня может быть только один Humidity
и ни одного аналога в другой базе данных. В этом случае запрос завершается ошибкой:
sqlite> SELECT * FROM Humidity UNION SELECT * FROM Old.Humidity;
SQL error: no such table: Old.Humidity
Я хотел бы получить все столбцы из таблиц, которые существуют, а не сбой только потому, что другая таблица не существует.
Я заранее не знаю, какие таблицы существуют в каких базах данных. У меня есть только имена таблиц из всех баз данных, объединенных в один список. И часть кодовой базы, которая считывает данные, ожидает получить все столбцы в одном запросе.
Комментарии:
1.
SELECT * FROM Humidity
xD2. Это приведет к сбою в случае, когда
Old.Humidity
на самом деле существует.
Ответ №1:
Невозможно создать запрос динамически в SQL. (SQLite предназначен для использования из приложения, написанного на «реальном» языке программирования.)
Вы должны заранее проверить, существует ли таблица (используйте PRAGMA table_info или попробуйте, работает ли запрос с использованием этой таблицы). Затем выполните запрос либо с ОБЪЕДИНЕНИЕМ, либо без него.
Комментарии:
1. Хорошо, спасибо. Я искал что-то похожее на
INSERT OR IGNORE...
, но похоже, что такого запроса не существует дляSELECT
2. Вы могли бы выполнить
CREATE TABLE IF NOT EXISTS Old.Humidity(...
, но я думаю, вы не хотите изменять старую базу данных.