Créer une table SQL inline à la volée (pour une jointure à gauche exclue))

supposons ce qui suit:

Tableau

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

j'ai une liste d'id (10, 11, 12, 13, 14) qui peut être utilisé pour rechercher des id dans ce tableau. Cette liste d'id est générée dans mon frontend.

en utilisant purement SQL, je dois sélectionner les id de cette liste (10, 11, 12, 13, 14) qui n'ont pas d'entrées dans le tableau A (à joindre dans la colonne "id"). Le résultat devrait être le jeu de résultats de l'id du 13 et 14.

Comment puis-je accomplir ceci en utilisant seulement SQL? (Aussi, 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 maintenir temporairement ma liste d'id. Cependant, je n'ai aucune idée de comment faire cela. Est-ce possible? Est-il un meilleur moyen?

Merci! :)

23
demandé sur rinogo 2012-05-23 00:12:40

4 réponses

Vous pouvez créer une "table en ligne" avec un UNION sous-requête:

(
            SELECT 10 AS id
  UNION ALL SELECT 11 UNION ALL SELECT 12 UNION ALL SELECT 13 UNION ALL SELECT 14
  -- etc.
) AS inline_table
23
répondu eggyal 2012-05-22 20:20:28

Vous pouvez faire cela à partir de SQL Server 2008 en utilisant un constructeur de valeurs 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: Tableau De La Valeur Constructeur

42
répondu phillip voyle 2014-09-15 07:06:48
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
        );
5
répondu Quassnoi 2012-05-22 20:16:20
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

0
répondu user3417837 2014-03-13 23:46:14