45

次のことを想定しましょう。

表A

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

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

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

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

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

ありがとう!:)

4

5 に答える 5

88

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

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

詳細はこちら: テーブル値コンストラクター

于 2014-09-15T07:06:48.057 に答える
31

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
于 2012-05-22T20:15:26.673 に答える
8
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
        );
于 2012-05-22T20:16:20.090 に答える
0

このようなものも機能します

    
    SELECT * FROM (
    SELECT 'ds' AS source
    UNION ALL
    SELECT 'cache' AS source
    ) as dataSource
----------
| source |
----------
| ds     |
----------
| cache  |
----------



于 2021-06-17T00:11:14.967 に答える
-1
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

于 2014-03-13T23:40:01.720 に答える