Создание встроенной SQL-таблицы на лету (для исключающего левого соединения)
Описание проблемы:
У меня есть таблица A со следующими данными:
id | value
----------
1 | red
2 | orange
5 | yellow
10 | green
11 | blue
12 | indigo
20 | violet
У меня также есть список идентификаторов (10, 11, 12, 13, 14
), который генерируется на стороне клиента и используется для поиска идентификаторов в этой таблице.
Мне нужно с помощью чистого SQL выбрать те идентификаторы из списка (10, 11, 12, 13, 14
), которые отсутствуют в таблице A (проверяем по столбцу 'id'). Ожидаемый результат — это набор идентификаторов 13
и 14
.
Как можно это реализовать, используя только SQL? (Хотелось бы избежать использования хранимых процедур, если это возможно.)
Единственный подход, который я могу придумать, — это создание временной таблицы с моим списком идентификаторов на лету. Однако у меня нет идей, как это сделать. Это возможно? Есть ли более эффективный способ достижения цели?
Спасибо! 😃
2 ответ(ов)
Ваш запрос создает временную таблицу ids
, в которую вы вставляете несколько значений. Затем, вы выбираете все записи из таблицы ids
, где id
не содержится в таблице a
. Вот шаги выполнения вашего запроса более подробно:
Создание временной таблицы:
CREATE TEMPORARY TABLE ids (id INT NOT NULL PRIMARY KEY);
Этот код создает временную таблицу
ids
с одним столбцомid
, который является первичным ключом и не может принимать значения NULL.Вставка значений:
INSERT INTO ids VALUES (10), (11), (12), (13), (14);
Здесь вы вставляете пять значений (10, 11, 12, 13 и 14) в таблицу
ids
.Выборка данных:
SELECT * FROM ids WHERE id NOT IN (SELECT id FROM a);
Этот запрос выбирает все строки из таблицы
ids
, для которыхid
отсутствует в таблицеa
. Это позволит вам получить те значения, которые не присутствуют в другой таблице.
Убедитесь, что таблица a
существует и заполнена данными, иначе подзапрос вернет пустой результат, и это может повлиять на итоговый результат основного запроса. Если у вас возникнут дополнительные вопросы или нужна помощь с оптимизацией запроса, не стесняйтесь уточнять!
Да, это также будет работать. Вот пример SQL-запроса, который создаёт временную таблицу и возвращает данные:
SELECT * FROM (
SELECT 'ds' AS source
UNION ALL
SELECT 'cache' AS source
) as dataSource
Результат выполнения этого запроса будет выглядеть следующим образом:
----------
| source |
----------
| ds |
----------
| cache |
----------
Таким образом, вы можете использовать подобный подход для объединения данных из нескольких источников. Если у вас есть дополнительные вопросы или вам нужно больше примеров, не стесняйтесь задавать!
SQL: выбрать только строки с максимальным значением в столбце
Когда использовать одинарные кавычки, двойные кавычки и обратные кавычки в MySQL
Удаление с использованием JOIN в MySQL
MySQL 1062 - Дубликат значения '0' для ключа 'PRIMARY'
java.sql.SQLException: Не найден подходящий драйвер для jdbc:mysql://localhost:3306/dbname