Supposons ce qui suit:
Tableau A
id | value
----------
1 | red
2 | orange
5 | yellow
10 | green
11 | blue
12 | Indigo
20 | Violet
J'ai une liste d'identifiants (10, 11, 12, 13, 14) qui peuvent être utilisés pour rechercher des identifiants dans ce tableau. Cette liste d'identifiants est générée dans mon frontend.
En utilisant purement SQL, je dois sélectionner les identifiants de cette liste (10, 11, 12, 13, 14) qui n'ont pas d'entrées dans le tableau A (se joindre à la colonne 'id'). Le résultat doit être l'ensemble de résultats des identifiants 13 et 14.
Comment puis-je accomplir cela en utilisant uniquement SQL? (De plus, j'aimerais éviter d'utiliser une procédure stockée si possible)
La seule approche à laquelle je peux penser est quelque chose qui créerait une table SQL en ligne à la volée pour contenir temporairement ma liste d'identifiants. Cependant, je n'ai aucune idée de comment procéder. Est-ce possible? Y a-t-il une meilleure façon?
Merci! :)
Vous pouvez créer une "table en ligne" avec une sous-requête 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
Vous pouvez le faire à partir de SQL Server 2008 à l'aide d'un constructeur de valeur de table.
SELECT * FROM (
VALUES(1, 'red'),
(2, 'orange'),
(5, 'yellow'),
(10, 'green'),
(11, 'blue'),
(12, 'Indigo'),
(20, 'Violet'))
AS Colors(Id, Value)
Plus d'informations ici: Constructeur de valeur de table
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