0

Создание встроенной SQL-таблицы на лету (для исключающего левого соединения)

10

Описание проблемы:

У меня есть таблица 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 ответ(ов)

0

Ваш запрос создает временную таблицу ids, в которую вы вставляете несколько значений. Затем, вы выбираете все записи из таблицы ids, где id не содержится в таблице a. Вот шаги выполнения вашего запроса более подробно:

  1. Создание временной таблицы:

    CREATE TEMPORARY TABLE ids (id INT NOT NULL PRIMARY KEY);
    

    Этот код создает временную таблицу ids с одним столбцом id, который является первичным ключом и не может принимать значения NULL.

  2. Вставка значений:

    INSERT INTO ids VALUES (10), (11), (12), (13), (14);
    

    Здесь вы вставляете пять значений (10, 11, 12, 13 и 14) в таблицу ids.

  3. Выборка данных:

    SELECT * FROM ids WHERE id NOT IN (SELECT id FROM a);
    

    Этот запрос выбирает все строки из таблицы ids, для которых id отсутствует в таблице a. Это позволит вам получить те значения, которые не присутствуют в другой таблице.

Убедитесь, что таблица a существует и заполнена данными, иначе подзапрос вернет пустой результат, и это может повлиять на итоговый результат основного запроса. Если у вас возникнут дополнительные вопросы или нужна помощь с оптимизацией запроса, не стесняйтесь уточнять!

0

Да, это также будет работать. Вот пример SQL-запроса, который создаёт временную таблицу и возвращает данные:

SELECT * FROM (
    SELECT 'ds' AS source
    UNION ALL
    SELECT 'cache' AS source
) as dataSource

Результат выполнения этого запроса будет выглядеть следующим образом:

----------
| source |
----------
| ds     |
----------
| cache  |
----------

Таким образом, вы можете использовать подобный подход для объединения данных из нескольких источников. Если у вас есть дополнительные вопросы или вам нужно больше примеров, не стесняйтесь задавать!

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь