-1

Ian、Stephen などの名前のリストと、次のようなデータベース テーブルがある場合:

Names (table name)
Ian
Stephen
Maria

このクエリによって、テーブルに表示されるリスト内の名前を見つけることができます: select * from names where names not in ('Ian','Stephen')。これは「Maria」を返します。

リストには存在するがデータベースには存在しない値を見つけるにはどうすればよいですか? たとえば、Ian、Maria、Kevin のリストと、次のテーブルがあるとします。

Names (table name)
Ian
Maria

Kevin を返すクエリを作成するにはどうすればよいですか? リストを別のテーブルにロードして LEFT JOIN できることは知っていますが、もっと簡単な方法がないか探しました。

4

5 に答える 5

1

SQL ではこれほど簡単な方法はありません。orを実行LEFT JOINするNOT INのが SQL の方法ですが、テーブルが必要です。これで、実際のテーブルを作成する必要がなくなりました。あなたは次のようなものを持つことができます:

with names as (
     select 'Ian' as name union all
     select 'Maria' as name union all
     select 'Kevin' as name
)
select *
from names n
where n.name not in (select name from t)

Excel でこれを行うこともできます。

  1. 値を列に入れる
  2. inリストを作成してクエリを実行する
  3. 結果を列に入れる
  4. vlookupまたはを使用matchして違いを見つけます
于 2012-12-07T19:08:31.883 に答える
0

OP には役に立ちませんが、SQL Server 2008 以降の環境にいる場合は、この構文も機能するはずです。

SELECT
    List.NAME
FROM ( VALUES
        ('Ian')
        ,('Maria')
        ,('Kevin')
    ) AS List(NAME)
    LEFT JOIN NAMES AS N
        ON List.NAME = N.NAME
WHERE N.NAME IS NULL
于 2012-12-10T14:46:27.360 に答える
0
select a.name from
(select "Ian" name from dual
 union
 select "Maria" from dual
 union
 select "Stephen" from dual) a
left outer join Names n using (name)
where n.name is null
于 2012-12-07T19:07:17.790 に答える
0
select * from mytable 
where names in ('kevin', 'maria', 'ian')

正しい入力で更新

上記をスクラッチしたい:$

以下をご覧ください。ただし、これは最適なクエリではありません。でも、とにかくやってみたかった。

参照 * SQLFIDDLE

テーブル:

NAME
john
ian
robin
maria
fen

クエリ:

select x.* from (
select * from names
union all
select 'kevin'
union all 
select 'ian'
union all
select 'maria') as x
where x.name not in 
(select * from names)
;

結果:

NAME
kevin
于 2012-12-07T19:07:56.800 に答える
0

TSQL では、名前のリストをテーブル変数にロードし、どちらのバージョンの検索でもそれを Names テーブルに結合します。変数テーブルはメモリ内に存在するため、通常のテーブルまたは一時テーブルを作成し、1 回の操作で値をディスクに書き込むオーバーヘッドが回避されます。

Declare @Temp table
(
    Name varchar(32)
)

Insert Into @Temp
Select 'Ian'
Union
Select'Stephen'
Union 
Select'Kevin'


Select
    T.Name
From @Temp as T
    left join Names as N
        on T.Name = N.Name
Where N.Name IS NULL

私の経験では、この結合構造は「NOT IN」方式よりもはるかに効率的です。

編集: DB バージョンの更新されたコード ブロック

于 2012-12-07T19:08:24.553 に答える