SQL Server 2008 Union '存在しないレコードを'作成 'を選択します。

SQL Server 2008でのUNION SELECTステートメントの結果には、どちらのソーステーブルにも存在しないレコードが含まれています。例:

theidは、各ソース表内の整数ID値です。いずれの表にも277741のid値は含まれていません。

Select *
From DataTable1
WHere theid = 277741
-- 0 records returned

Select *
From DataTable2
Where theid = 277741
-- 0 records returned

ただし、以下のUnion Selectステートメントを実行すると、theidのレコードが生成されます。

Select *
Into ConjoinedData
From DataTable1
Union
Select *
From DataTable2
Where theid Not In (Select theid From DataTable1)

Select 
From ConjoinedData
Where theid = 27741
-- 1 record returned

theidフィールドはいずれかのソーステーブルのIDフィールドではありません。最終的に、DataTable1とDataTable2のデータは、ID 277741の無関係のレコードを含む同じ親から取得されました。ただし、いずれかのソーステーブルの外部キー関係やその他のテーブルは存在しません。私は、成功していないUnion Allクエリに変更しようとしました。ソーステーブルの両方でtheidのインデックスを作成し、 'created'レコードが表示されます。私は無駄にソーステーブルを何度もドロップして再作成しました。なぜSQL Serverは切断された親テーブルから関連のないレコードを取得しますか(ソースタルブはどちらもSelect..Intoステートメントを使用して同じ親から列挙され、どちらのテーブルにも親に戻ることはありません)

0
あなたの問題を示す再現スクリプトを提供してください。
追加された 著者 Martin Smith,
UNIONは重複を削除するので、Select * ConjoinedDataからDataTable1を選択します。Union Select * DataTable2から(DataTable1からデータを選択します)Select * ConjoinedDataからDataTable1 Union Selectから* DataTable2はユニークな "theid"ですか?それはintですか?
追加された 著者 Andy Irving,
既に必要とされているスクリプトには何が欠けていますか?
追加された 著者 Mitch Grout,

1 答え

277741 is different from 27741. The following script reproduces exactly what you describe:

create table Table1 (id int);
create table Table2 (id int);
go

insert into Table1(id) values (277742);
insert into Table2(id) values (27741);
go


Select * From Table1 WHere id = 277741;
Select * From Table2 Where id = 277741;
go

Select *
Into ConjoinedData
From Table1
Union
Select *
From Table2
Where id Not In (Select id From Table1);

Select *
From ConjoinedData
Where id = 27741;
1
追加された
それからあなたの質問を修正してください。また、正確な表の定義を指定します。
追加された 著者 Remus Rusanu,
値27741はタイプミスです。レコードは親レコードに存在しますが、どちらの子レコードにも属していないことに注意してください。また、共用レコードは子テーブルのみを結合することを意図しています。その結合の結果は依然として親のサブセットです。
追加された 著者 Mitch Grout,