Ответ 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
Предположим следующее:
Таблица 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 на лету, чтобы временно сохранить мой список идентификаторов. Однако я не знаю, как это сделать. Это возможно? Есть ли лучший способ?
Спасибо!:)
Вы можете создать "встроенную таблицу" с подзапросом 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
Вы можете сделать это с SQL Server 2008 с помощью конструктора значений таблиц.
SELECT * FROM (
VALUES(1, 'red'),
(2, 'orange'),
(5, 'yellow'),
(10, 'green'),
(11, 'blue'),
(12, 'indigo'),
(20, 'violet'))
AS Colors(Id, Value)
Дополнительная информация здесь: Конструктор значений таблиц
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
);
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