[解決済み] SQL NOT IN が機能しない
質問
2 つのデータベースがあります。1 つは在庫を保持し、もう 1 つはプライマリ データベースのレコードのサブセットを保持するデータベースです。
次の SQL 文は動作しません。
SELECT stock.IdStock
,stock.Descr
FROM [Inventory].[dbo].[Stock] stock
WHERE stock.IdStock NOT IN
(SELECT foreignStockId FROM
[Subset].[dbo].[Products])
not in は機能しません。NOT を削除すると、正しい結果、つまり両方のデータベースにある製品が返されます。しかし、NOT IN を使用すると、まったく結果が返されません。
私は何を間違えているのでしょうか、何かアイデアはありますか?
どのように解決するのですか?
SELECT foreignStockId
FROM [Subset].[dbo].[Products]
おそらく
NULL
.
A
NOT IN
クエリは、もし
NULL
のリストに
NOT IN
の値のリストに含まれています。を使って明示的に除外することができます。
IS NOT NULL
を使って明示的に除外することができます。
SELECT stock.IdStock,
stock.Descr
FROM [Inventory].[dbo].[Stock] stock
WHERE stock.IdStock NOT IN (SELECT foreignStockId
FROM [Subset].[dbo].[Products]
WHERE foreignStockId IS NOT NULL)
または
NOT EXISTS
を使って書き直すこともできます。
SELECT stock.idstock,
stock.descr
FROM [Inventory].[dbo].[Stock] stock
WHERE NOT EXISTS (SELECT *
FROM [Subset].[dbo].[Products] p
WHERE p.foreignstockid = stock.idstock)
の実行計画が欲しいというセマンティクスを持つのと同時に
NOT EXISTS
の実行計画は、しばしばより単純な
であることが多いのですが、ここでは
.
動作の違いの理由は
三値論理
が SQL で使用されているからです。述語は以下のように評価されます。
True
,
False
または
Unknown
.
A
WHERE
節は
True
と評価されなければなりませんが、これは
NOT IN
の場合は
NULL
が存在する場合、以下に説明するように
'A' NOT IN ('X','Y',NULL)
とは
'A' <> 'X' AND 'A' <> 'Y' AND 'A' <> NULL)
-
'A' <> 'X' =。
True
-
'A' <> 'Y'=の場合
True
-
'A' <> NULL =。
Unknown
True AND True AND Unknown
は、以下のように評価されます。
Unknown
と評価されます。
三値論理の真理値表
.
次のリンクは、さまざまなオプションのパフォーマンスに関する追加的な議論を含んでいます。
関連
-
ERROR 1136 (21S01) を解決してください。列の数が Mysql の行 1 の値の数と一致しません。
-
[解決済み] SQL ServerでSELECTからUPDATEする方法とは?
-
[解決済み] PHPでSQLインジェクションを防ぐにはどうしたらいいですか?
-
[解決済み] MySQLでコマンドラインを使用してSQLファイルをインポートするにはどうすればよいですか?
-
[解決済み] SQLテーブルで重複する値を検索する
-
[解決済み] SQL Server で複数行のテキストを 1 つのテキスト文字列に連結する方法
-
[解決済み] SQL Server の DateTime データ型から日付だけを返す方法
-
[解決済み] SQLのSELECTでIF...THENを実行するにはどうすればよいですか?
-
[解決済み] SQL Serverでレコードを削除した後、IDシードをリセットする。
-
[解決済み】SQL Serverで既存のテーブルにデフォルト値を持つカラムを追加する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
解決策:ユーザー root で localhost:3306 にある MySQL に接続できませんでした。
-
[解決済み] 1つのPostgreSQLクエリで複数のWITHステートメントを使用するには?
-
[解決済み] データベースのインデックス作成はどのように行われるのですか?[クローズド]
-
[解決済み] SQLのIN句をパラメータ化する
-
[解決済み] INNER JOIN ON vs WHERE句
-
[解決済み] SQL Serverで、指定したテーブルを参照しているすべての外部キーを一覧表示するにはどうすればよいですか?
-
[解決済み] MySQLでFULL OUTER JOINを行うにはどうすればよいですか?
-
[解決済み] フラットテーブルをツリーにパースする最も効率的/エレガントな方法は何ですか?
-
[解決済み] SQL Serverで結果をページ分割する最も良い方法は何ですか?
-
[解決済み] 文字列の一部をUPDATEおよびREPLACEする。