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

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

Предположим следующее:

Таблица A

id | value
----------
1   | red
2   | orange
5   | yellow
10  | green
11  | blue
12  | indigo
20  | violet

У меня есть список id (10, 11, 12, 13, 14), который можно использовать для поиска идентификатора в этой таблице. Этот список идентификаторов создается в моем интерфейсе.

Используя чисто SQL, мне нужно выбрать идентификатор из этого списка (10, 11, 12, 13, 14), которые не имеют записей в таблице A (присоединение к столбцу "id" ). Результатом должен быть конечный набор идентификаторов 13 и 14.

Как это сделать, используя только SQL? (Кроме того, я хотел бы избежать использования хранимой процедуры, если это возможно)

Единственный подход, который я могу придумать, - это то, что создало бы встроенную таблицу SQL на лету, чтобы временно сохранить мой список идентификаторов. Однако я не знаю, как это сделать. Это возможно? Есть ли лучший способ?

Спасибо!:)

4b9b3361

Ответ 1

Вы можете создать "встроенную таблицу" с подзапросом UNION:

(
            SELECT 10 AS id
  UNION ALL SELECT 11 UNION ALL SELECT 12 UNION ALL SELECT 13 UNION ALL SELECT 14
  -- etc.
) AS inline_table

Ответ 2

Вы можете сделать это с SQL Server 2008 с помощью конструктора значений таблиц.

SELECT * FROM (
   VALUES(1, 'red'),
         (2, 'orange'),
         (5, 'yellow'),
         (10, 'green'),
         (11, 'blue'),
         (12, 'indigo'),
         (20, 'violet'))
   AS Colors(Id, Value)

Дополнительная информация здесь: Конструктор значений таблиц

Ответ 3

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

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

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

Ответ 4

create table B (id int)
insert into B values (10),(11),(12),(13),(14)

select *
from B
left join A 
on A.id=B.id
where A.id is null

drop table B

http://sqlfiddle.com/#!6/6666c1/30