2016-04-27 13 views
1

私は2つのテーブルを作成しましたが、いくつかの奇妙な理由から予想外のレコードが返されています。SQL Server内部結合重複レコードの作成

表1は、「バージョン1」の2つのレコード、「バージョン2」の2つのレコード、「バージョン3」の2つのレコードを含む6つのレコードを含む。表2は、「バージョン1」の10個のレコードを含む10個のレコードを有する。私がバージョンフィールドでそれらの間の内部結合を行う場合、私は2レコードしか得られないだろうと思ったでしょう:表1と表2は、表1に2つしかない「バージョン1」と一致します。

ただし、次のクエリは、20件のレコードを返します(どちらかといえば私でしそれが参加交差に変換するなら60を記録、また間違っているだろう理解の):誰もが何が起こっているかについて説明することができます

SELECT * FROM TABLE2 T2 INNER JOIN TABLE1 T1 on T2.VersionKey = T1.VersionKey 

私は期待通りの結果を得ていますが、私はここで違いを見ることができません非常に似ている別のセットのテーブルがあります。

ここには基本的なテーブル構造とデータがあります。

CREATE TABLE [dbo].[Table1] (
    [ID] [int] IDENTITY(1,1) NOT NULL, 
    [VersionKey] [int] NULL, 
    CONSTRAINT [PK_Table1] PRIMARY KEY CLUSTERED ([ID] ASC) 
    WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 
GO 

CREATE TABLE [dbo].[Table2] (
    [ID] [int] IDENTITY(1,1) NOT NULL, 
    [VersionKey] [int] NULL, 
    CONSTRAINT [PK_Table2] PRIMARY KEY CLUSTERED ([ID] ASC) 
    WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 
GO 

INSERT INTO [Table1] (VersionKey) 
    SELECT 1 UNION ALL 
    SELECT 1 UNION ALL 
    SELECT 2 UNION ALL 
    SELECT 2 UNION ALL 
    SELECT 3 UNION ALL 
    SELECT 3 
GO 

INSERT INTO [Table2] (VersionKey) 
    SELECT 1 UNION ALL 
    SELECT 1 UNION ALL 
    SELECT 1 UNION ALL 
    SELECT 1 UNION ALL 
    SELECT 1 UNION ALL 
    SELECT 1 UNION ALL 
    SELECT 1 UNION ALL 
    SELECT 1 UNION ALL 
    SELECT 1 UNION  
    SELECT 1 
GO 
+0

Werid。余分なコメント。私はちょうど真新しいデータベースで上記を行いました、そして、私が期待したようにそれは変わりつつあります。しかし、私の既存のデータベースではそれはまだ正しくありません。私はフラッシュするかリフレッシュする必要がありますか? – ptownbro

+0

20行は、表示されたデータの期待通りの正しい結果です。 –

+0

INNER JOINはプライマリに1対1を作成していますが、これは2つのマッチを持ちます。したがって、2 x 10 = 20.重複を望まない場合は、それらをグループ化したり、一意に選択したりすることができます。 –

答えて

1

設定スクリプトにバグがあります。 SEDEにUNION ALLすべきか、重複を削除し、1つのだけの行を挿入する

INSERT INTO [Table2] (VersionKey) 
    SELECT 1 UNION ALL 
    SELECT 1 UNION ALL 
    SELECT 1 UNION ALL 
    SELECT 1 UNION ALL 
    SELECT 1 UNION ALL 
    SELECT 1 UNION ALL 
    SELECT 1 UNION ALL 
    SELECT 1 UNION ALL 
    SELECT 1 UNION  
    SELECT 1 

最終UNION必要があることではない10.

固定スクリプトおよび照会結果は、ここでhttps://data.stackexchange.com/stackoverflow/query/478676/fixed-script

では20行を返しますこれは予期され、正しいものです。

論理的には、左側のテーブルの各行が右側のテーブルのすべての行と比較されます。結合述部がtrueと評価された場合、一致は保持されます。

On 1=1のような内部結合述語の場合、左のすべての行が右端のすべての行と正常に一致してしまうため、クロス結合で終わるだけです。

バージョンキーが1のTable1の両方の行がTable2の10個の行と一致するので、一緒に20行になります。 Table1の残りの行は何も正常に結合せず、0行を提供しません。

+0

私が上記のように...これは意味をなさない。私はちょうど上記の正確なスクリプトを使用して2つのレコードを返すブランドの新しいデータベースを作成しました。ですから、私の現在のdbには別の結果を引き起こす何かが存在しなければなりません。上記の私のコメントを別の返信にも見てください。 – ptownbro

+1

私はMartinsの優れた合計と100%合意し、提供されたサンプルデータとMartinが提案したtable2への変更に基づいて、あなたが見ている結果を再現することができました。 –

+0

正しい。ご協力いただきありがとうございます。 – ptownbro

0

クレジットは

のように雄弁に結果が正しいと、私の例を使用して、それが必要(あなたの助けのおかげで再び)他の人が先に説明し...上記マーチンになりますが、以下の他人のための答えを明確にします20レコードを生成する。しかし、ここに私の元の質問であったことが起こっている理由についての説明があります。

重複するレコードの理由は、参加するテーブルに、参加するフィールドにレコードが重複しているためです。私は、それぞれ2100件のと3レコードが含まれている私の他のテーブルでこれを見ていない理由のために謎を解き

enter image description here

。 3つのレコードを持つテーブルに重複はありません。したがって、最終的なクエリ結果に重複はありません。

IDフィールドのようなインデックス付きプライマリキーフィールドに通常参加している場合と、ここで行ったこととを比較する理由があります。そのような場合、これらのレコードの値は常に重複しないように固有である可能性が高いためです。

もう一度お返事いただき、ありがとうございます。

ここに私の訂正されたコードがあり、結果を再現するためのバグが修正されています。

CREATE TABLE [dbo].[Table1] (
    [ID] [int] IDENTITY(1,1) NOT NULL, 
    [VersionKey] [int] NULL, 
    CONSTRAINT [PK_Table1] PRIMARY KEY CLUSTERED ([ID] ASC) 
    WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 
GO 

CREATE TABLE [dbo].[Table2] (
    [ID] [int] IDENTITY(1,1) NOT NULL, 
    [VersionKey] [int] NULL, 
    CONSTRAINT [PK_Table2] PRIMARY KEY CLUSTERED ([ID] ASC) 
    WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 
GO 

INSERT INTO [Table1] (VersionKey) 
    SELECT 1 UNION ALL 
    SELECT 1 UNION ALL 
    SELECT 2 UNION ALL 
    SELECT 2 UNION ALL 
    SELECT 3 UNION ALL 
    SELECT 3 
GO 

INSERT INTO [Table2] (VersionKey) 
    SELECT 1 UNION ALL 
    SELECT 1 UNION ALL 
    SELECT 1 UNION ALL 
    SELECT 1 UNION ALL 
    SELECT 1 UNION ALL 
    SELECT 1 UNION ALL 
    SELECT 1 UNION ALL 
    SELECT 1 UNION ALL 
    SELECT 1 UNION ALL 
    SELECT 1 
GO 

SELECT * FROM TABLE2 T2 INNER JOIN TABLE1 T1 on T2.VersionKey = T1.VersionKey