web-dev-qa-db-fra.com

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

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! :)

30
rinogo

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
25
eggyal

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

55
phillip voyle
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
        );
6
Quassnoi
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/

0
user3417837