SQLの副問い合わせで手抜きをすると痛い目を見る罠
本職ではないですがRDBの扱いは初心者は卒業したくらいの私です
今回はSQL Server 15.0.*を使っていてはまった罠について (バージョンは関係ないかな)
準備
A
とB
というテーブルを作ります
CREATE TABLE [dbo].[A]( [ID] [int] NOT NULL, [BID] [int] NOT NULL, CONSTRAINT [PK_A] PRIMARY KEY CLUSTERED ( [ID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY] ) ON [PRIMARY] CREATE TABLE [dbo].[B]( [BID] [int] NOT NULL, [TYPE] [int] NULL, CONSTRAINT [PK_B] PRIMARY KEY CLUSTERED ( [BID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY] ) ON [PRIMARY]
リレーションは面倒なので貼っていませんが、A.BIDとB.BIDが外部参照しているつもりになってください
テーブル作ったら適当にデータ突っ込みます
A
B
副問い合わせあるいはサブクエリー
A
のデータのうちB
のTYPE
が0のものだけ検索します
select * from A where BID in (select BID from B where TYPE = 0)
SQL文の中で一番好きなのが in
です。目的のものが検索できていますね
間違えてみる
A
とB
はカラム名が紛らわしいので間違えてしまいました
select * from A where BID in (select ID from B where TYPE = 0)
select ID from B where TYPE = 0
の ID
が間違いで、これ単体で実行すると
となるんですが、副問い合わせの場合A.ID
を参照するみたいです (よくわかりません)
まとめ
上記のような間違いを起こさないようにカラムの指定はちゃんと書きましょう
select * from A where A.BID in (select B.BID from B where B.TYPE =0)
おしまい