質問
この問題のた場も異なる記録数を用いた同一のクエリを使 not in
where
制約、その他 left join
.テーブルに not in
制約があった一方がnull値(badデータ)によるクエリが返すカウントが0の記録です。私のようなぜこのようなもの一助に把握、コンセプトです。
る状態で単純なクエリを返す結果がBさん?
A: select 'true' where 3 in (1, 2, 3, null)
B: select 'true' where 3 not in (1, 2, null)
このたSQL Server2005年.他にも呼び出し set ansi_nulls off
原因を返します。
解決
クエリと同じです:
select 'true' where 3 = 1 or 3 = 2 or 3 = 3 or 3 = null
以降 3 = 3
はtrueを取得します。
クエリをBと同じです:
select 'true' where 3 <> 1 and 3 <> 2 and 3 <> null
時 ansi_nulls
すると、 3 <> null
が不明なので、述語に評価し、得られないときには、いくつかの意されています。
時 ansi_nulls
off 3 <> null
がtrueの場合、その述語の評価をtrueにする。
他のヒント
きNULLを使用んを取り扱う三値論理です。
最初のクエリを返します結果としてのWHERE句であると評価:
3 = 1 or 3 = 2 or 3 = 3 or 3 = null
which is:
FALSE or FALSE or TRUE or UNKNOWN
which evaluates to
TRUE
二つ目:
3 <> 1 and 3 <> 2 and 3 <> null
which evaluates to:
TRUE and TRUE and UNKNOWN
which evaluates to:
UNKNOWN
未知のと同じではないFALSEの場合 簡単に試験を呼び出します。
select 'true' where 3 <> null
select 'true' where not (3 <> null)
両方の問合せません結果
場合は、未知を行うために欠かせないFALSEの場合それまでの最初のクエリーだとFALSEのい評価をTRUEにしてしまうのと同じない(FALSE)です。
ですが、実はそうではありません。
が非常に良い 記本件SqlServerCentral.
問題の全体がNull、三値論理できるビットの混乱が、そのしくみを把握することが重要となります書くために正しい検索のTSQL
他の記事でおすすめです SQL集計機能およびNULLの場合.
NOT IN
0を返します記録に対して比較される未知の価値
以降 NULL
が知られていませんが、 NOT IN
クエリを含む NULL
または NULL
sリストの指定できる値は常に戻す 0
記録がありませんのにっていることをご確認ください NULL
値は、値が試されているわけです。
比較nullの場合は未定義を使用しない限りはNULLになります。
そのため、比較3NULL(クエリ)を返します定義されていません。
I.。選択'true'が3(1,2,null) や 選択'true'が3は(1,2,null)
同結果としては未定義はまだ未定義はTRUE
タイトルのこの質問には
SQLな制約およびNULL値
からのテキストの面での問題が発生するSQL DML SELECT
クエリではなくSQL DDL CONSTRAINT
.
しかし、特に、言葉にしたいポイントの一部で算出していくことは誤解を与える可能性があるもの諸表れる(言い換え)
が述語の評価を得られないときには、いくつかの意されています。
この場合SQL DML考えの場合は制約の影響が異なります。
このことを考えても簡単にテーブルを二つの制約から直接述語の問題と取り組む優れた回答@Brannon):
DECLARE @T TABLE
(
true CHAR(4) DEFAULT 'true' NOT NULL,
CHECK ( 3 IN (1, 2, 3, NULL )),
CHECK ( 3 NOT IN (1, 2, NULL ))
);
INSERT INTO @T VALUES ('true');
SELECT COUNT(*) AS tally FROM @T;
当@Brannonの答えは、最初の制約を利用 IN
)の評価がTRUEの制約を利用 NOT IN
)に評価します。 しかし, の挿入が成功する!そのため、この場合はありません正しい"と言い得られないときには、いくつかの他の行なうたた列として挿入します。
上記の効果が実際に正しいについては、SQL-92ます。インテル®solid-state drive以下のセクションのSQL-92仕様
7.6where句
の結果はテーブルの行のため の検索結果の状態はtrueになります。
4.10一貫性制約の
テーブルのチェックの制約を満たした場合にのみ指定 検索条件がない場合は、他の列を表示します。
言い換えれば
SQL DML列から除去されることができるのは、 WHERE
評価は不明で ない の条件を満たした"がtrueになります。
SQL DDL(制約),行ないから除去されることができるのかを評価する未知ので は の条件を満たした"からは"false"です。
その効果をSQL DMLは、SQL DDLそれぞれが相反する、実践的な理由を知らの結果を便益の違いによるを満たす制約(より正確にできな満足する制約なし):この行動毎の制約に明示的にnullが非常に物足りないから言語のデザイン的見地からはもちろんのこと、右の痛みのためにグラマー!)
p.s.までとして挑戦するなどの論理として"未知の失敗しない満たす制約として"私は書くので、そのつもりで全部やってほしいで塗布することが可能ですべてのことだけを回避することによるnullableの列のSQL DDLとなSQL DMLを生成するnull例外側join)!
に、3つのコールがテストされていますの平等に対し各メンバーのセットは、降伏TRUE,FALSE,TRUE,不明.の一つの要素がTRUEの状態はTRUEになります。(している可能性もあります一部の短絡はこちらで実際に停止してもヒットで最初の本とな評価3=NULLになります。)
Bさんを評価する条件としていない(3(1,2,null)).試験3等に対する設定利回り(FALSEの場合、FALSEの場合、不明である集計には不明である。ない(UNKNOWN)利回ります。従って全体としての真実の状況が不明であるのは基本的に処理としてFALSEです。
Nullの意味が存在しないこと、およびデータで、データの価値はない。非常に簡単でからの方々のプログラミングの背景を混乱させることでC型言語の使用時にポインタがnullがいます。
この場合3が実際にセット(1,2,3,null)でtrueが返されます
にしきの動きをタイムリーかつ詳細に
選択'true'が3にない(null)
でもこのパーサを知っても設定についても書いてください。をもとではない空のセットが未知のセットです。利用(1,2,null)はならないので(1,2)の設定はfalse、そんandる未知であるのか不明です。
で締結するから答えはここに NOT IN (subquery)
んnullを正しく輸入-輸出が全部可能ですので賛成 NOT EXISTS
.しかし、このような結論するのは時期尚以下のシナリオをごChris日(データベースプログラミングやデザインVol.2いいえ9月1989年) NOT IN
を取り扱うnull正を返します正しい結果より NOT EXISTS
.
検討テーブル sp
を代表する取引先のsno
者への供給部品pno
)数量(qty
).のテーブルは現在の値
VALUES ('S1', 'P1', NULL),
('S2', 'P1', 200),
('S3', 'P1', 1000)
注数量がnullableる記録できるとのサプライヤーでは部品の供給ものでなくても知られています。
のタスクは、取引先人の知られていな環境で仕事に取り組みたい企業の数"P1"でもない量の1000です。
以下の利用 NOT IN
を正確に把握しサプライヤ'S2'のみ
WITH sp AS
( SELECT *
FROM ( VALUES ( 'S1', 'P1', NULL ),
( 'S2', 'P1', 200 ),
( 'S3', 'P1', 1000 ) )
AS T ( sno, pno, qty )
)
SELECT DISTINCT spx.sno
FROM sp spx
WHERE spx.pno = 'P1'
AND 1000 NOT IN (
SELECT spy.qty
FROM sp spy
WHERE spy.sno = spx.sno
AND spy.pno = 'P1'
);
ただし、以下のクエリ用の一般的構造が NOT EXISTS
が誤を含むサプライヤ'S1の結果(の量がnullの場合):
WITH sp AS
( SELECT *
FROM ( VALUES ( 'S1', 'P1', NULL ),
( 'S2', 'P1', 200 ),
( 'S3', 'P1', 1000 ) )
AS T ( sno, pno, qty )
)
SELECT DISTINCT spx.sno
FROM sp spx
WHERE spx.pno = 'P1'
AND NOT EXISTS (
SELECT *
FROM sp spy
WHERE spy.sno = spx.sno
AND spy.pno = 'P1'
AND spy.qty = 1000
);
なので NOT EXISTS
ではない新しい登場!
もちろん、ソースの問題の存在がnullのため、"リアルソリューションをそのnull.
達成することができ若きデザインなど)を用いたテーブル:
sp
お取引先に周知の部品の供給spq
お取引先に周知部品等を供給することが明らかとなっ量
注意が必要だろうとする外部キー制約が spq
参考文献 sp
.
の結果を取得でき用のナ関係者の EXCEPT
キーワードは標準のSQL例
WITH sp AS
( SELECT *
FROM ( VALUES ( 'S1', 'P1' ),
( 'S2', 'P1' ),
( 'S3', 'P1' ) )
AS T ( sno, pno )
),
spq AS
( SELECT *
FROM ( VALUES ( 'S2', 'P1', 200 ),
( 'S3', 'P1', 1000 ) )
AS T ( sno, pno, qty )
)
SELECT sno
FROM spq
WHERE pno = 'P1'
EXCEPT
SELECT sno
FROM spq
WHERE pno = 'P1'
AND qty = 1000;
したい場合にフィルタは、サブクエリcontaing Null justcheckのためのnullでない場合
SELECT blah FROM t WHERE blah NOT IN
(SELECT someotherBlah FROM t2 WHERE someotherBlah IS NOT NULL )
こちらはBoy:
select party_code
from abc as a
where party_code not in (select party_code
from xyz
where party_code = a.party_code);
この作品を問わずansi設定
またこの使用人が知らの論理的な違い、存在すると http://weblogs.sqlteam.com/mladenp/archive/2007/05/18/60210.aspx