2016-09-28 15 views
-2

したがって、いくつかのシーケンシャルCTEの出力をテーブルに書き込んでいます。また、CTEの1つで内部結合から左結合への結合を修正したところテーブル内の重複したエントリで、挿入せずにクエリを実行するだけでは表示されません。SQL Server 2012でCTEのテーブルに重複エントリを書き込む

CTEでの結合に関するテーブルの作成と挿入について理解する必要がありますか?

EDIT

create table MYTABLE 
(
    ID int, 
    Date smalldatetime, 
    Val1 int, 
    Val2 int 
) 

; with cte1 as (
select 
    a.ID, 
    a.Date, 
    a.Val1, 
    b.Val2 
from table1 a 
left join table2 b 
    on a.ID = b.ID 
    and a.Date = b.Date 
) 

insert into MYTABLE 
(ID, Date, Val1, Val2) 
select * from cte1 

重複に問題がないジョイン内でテーブルを作成します。 (上記のように)左側の結合では、NULLが存在する行が何回も複製されているように見えます。

+0

問題のトラブルシューティングをお手伝いしたい場合は、問題のあるコードを実際に含める必要があります。また、通常、サンプルデータと望ましい結果も含める必要があります。 http://meta.stackoverflow.com/questions/271055/tips-for-asking-a-good-structured-query-language-sql-question/271056 – Matt

+0

あなたは左側の表にはないレコードがあるようです右側のテーブルに腐食性の記録がある。 LEFT JOINを使用すると、左側のすべてのレコードが来ますが、INNER JOINを使用すると、マスクされます。 –

答えて

0

私の推測では、同じIDと日付を持つ複数のレコードがあります。

これが該当する場合、CTEですべて選択(*)を行うとレコードが技術的に重複しないため、変更された他のフィールドが表示されます。

フィールドの残りの部分について気にしない場合は、CTEにRow_Numberを追加し、CTEの外側にRow_Number = 1を選択してみてください。例えば

create table MYTABLE 

(
    ID int, 
    Date smalldatetime, 
    Val1 int, 
    Val2 int 
) 

; with cte1 as (
select 
    a.ID, 
    a.Date, 
    a.Val1, 
    b.Val2 
    Rnum = ROW_NUMBER() OVER(PARTITION BY a.ID, a.Date, a.Val1, a.Val2 ORDER BY ID) 
from table1 a 
left join table2 b 
    on a.ID = b.ID 
    and a.Date = b.Date 
) 

insert into MYTABLE 
(ID, Date, Val1, Val2) 
select ID, Date, Val1, Val2 from cte1 
where Rnum = 1 

ROW_NUMBERは「明確な」として機能し、あなたが重複しないようにしたいフィールドのどのような組み合わせに応じて、あなたは異なる結果が得られます。例えば

、そして、あなたが複製のIDを気にしない、しかし、あなたが同じ日に同じIDを使用しない場合は、

Rnum = ROW_NUMBER() OVER(PARTITION BY a.ID ORDER BY ID) 

、その後、IDが重複しない場合

Rnum = ROW_NUMBER() OVER(PARTITION BY a.ID, a.Date ORDER BY ID) 

など....あなたが複製したくないものの選択基準によります。 希望する場合は

関連する問題