web-dev-qa-db-ja.com

オンザフライでインラインSQLテーブルを作成(左結合を除く)

以下を想定しましょう:

テーブルA

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

このテーブルでIDを検索するために使用できるID(10、11、12、13、14)のリストがあります。このIDのリストは、私のフロントエンドで生成されます。

純粋にSQLを使用して、このリストからIDを選択する必要があります(10、11、12、13、14)。これには、テーブルAのエントリ(「id」列で結合)がありません。結果は、idの13と14の結果セットになります。

SQLのみを使用してこれをどのように達成できますか? (また、可能な場合はストアドプロシージャの使用を避けたい)

私が考えることができる唯一のアプローチは、IDのリストを一時的に保持するためにインラインSQLテーブルをその場で作成するものです。ただし、これを行う方法はわかりません。これは可能ですか?もっと良い方法はありますか?

ありがとう! :)

30
rinogo

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

SQL Server 2008以降では、テーブル値コンストラクタを使用してこれを行うことができます。

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

詳細はこちら: Table Value Constructor

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