5

Country、State、およびその他のデータ フィールドを持つテーブル Address について考えてみます。国、州の組み合わせが (US, IL)、(US,LA)、(IND,DEL) のレコードを除くすべてのレコードを取得したい

クエリは次のようになります

Select * from Address a 
where not exists 
(
   select Country,State 
   (select 'US' as Country, 'IL' as State 
     union
   select 'US' as Country, 'LA' as State 
     union
    select 'IND' as Country, 'DEL' as State 
  ) e
 where e.Country != a.Country and e.State != a.state
)

どうすれば簡単に達成できますか (country,state のユニオンの組み合わせを単純なサブクエリに置き換えるには)? 合計データはそれほど大きくないので、今のところパフォーマンスについてはほとんど気にしていません。


テーブル変数を作成し、構文への挿入を使用してそこにすべてのリテラルの組み合わせを追加し、存在しないテーブル変数を使用できることは知っていますが、小さな要件(2つの変数に存在しない)にはやり過ぎだと感じています。

4

3 に答える 3

6

クエリがこれを試みたようです:

select * 
from Address a 
where not exists (
                 select *
                 from (
                      select 'US' as Country, 'IL' as State union all
                      select 'US' as Country, 'LA' as State union all
                      select 'IND' as Country, 'DEL' as State 
                      ) e
                 where e.Country = a.Country and 
                       e.State = a.State
                 )

または、派生テーブルを使用できず、それでも同じ結果が得られます

select *
from Address as a
where not (
          a.Country = 'US' and a.State = 'IL' or
          a.Country = 'US' and a.State = 'LA' or
          a.Country = 'IND' and a.State = 'DEL'
          )
于 2013-11-14T17:55:30.327 に答える
2

クエリで値を直接使用するだけです。

-- Sample data.
declare @Table as Table ( Country VarChar(6), State VarChar(6), Foo VarChar(6) );
insert into @Table ( Country, State, Foo ) values
  ( 'US', 'IL', 'one' ), ( 'XX', 'LA', 'two' ), ( 'IND', 'XXX', 'three' ), ( 'IND', 'DEL', 'four' );

select * from @Table;

-- Demonstrate excluding specific combinations.
select T.*
  from @Table as T left outer join
    ( values ( 'US', 'IL' ), ( 'US', 'LA' ), ( 'IND', 'DEL' ) ) as Exclude( Country, State )
    on T.Country = Exclude.Country and T.State = Exclude.State
  where Exclude.Country is NULL;
于 2013-11-14T18:22:22.237 に答える
1

また

select * 
from Address a 
left outer join
    ( select 'US' as Country, 'IL' as State 
        union select 'US', 'LA'  
        union select 'IND', 'DEL'  ) as n
    on a.Country = n.Country and a.State = n.State
  where n.Country is NULL;
于 2013-11-14T18:36:03.783 に答える