2017-08-08 4 views
0

複数のテーブルから値を選択して別のテーブルに値を挿入しようとしています。これらの値の1つは区別する必要があります。 CTEでこれをどうやって行うのですか?SQL Server:1つのフィールドが異なるフィールドで複雑な選択クエリを挿入する

マイクエリ:

insert into Cycle (CycleID, PlotID, Product, Variety, Start, End) 
Select CycleID, o.ID, 'Product', v.ID, t.Start, t.End 
from 
Import as t 
inner join Varieties as v 
on t.Name like v.Name 
inner join Plots as o 
on t.PlotCode like o.PlotCode 

私は、これはt.CycleIDは別個のものであるエントリのみを選択するようにする必要があります。

答えて

1

一つの可能​​なSQLのトリックはorder by row_number

insert into Cycle (CycleID, PlotID, Product, Variety, Start, End) 
Select top 1 with ties CycleID, o.ID, 'Product', v.ID, t.Start, t.End 
from Import as t 
inner join Varieties as v on t.Name like v.Name 
inner join Plots as o on t.PlotCode like o.PlotCode 
order by row_number() over (partition by CycleID order by o.ID desc, v.ID desc, t.Start desc, t.End desc) 

免責事項と組み合わせてtop 1 with tiesを使用することです:唯一のメモ帳完全に働いた

+0

でテストし、感謝! –

+1

@BorisK Btw、あなたは本当にそれらの結合でLIKEを使用する必要がありますか?それが意図的でv.Nameとo.PlotCodeが '%'または '_'(f.e." x%y%1_2 ")の文字列を持つ場合、' = 'を使用すると、クエリオプティマイザがより速い実行計画を出すことができます。 – LukStorms

+0

ああ、確かに。私は非常に小さなデータセット、数百レコードで作業していますが、後で使用するために留意しています。 –

0
;WITH CTE AS (

Select DISTINCT CycleID, o.ID, 'Product', v.ID, t.Start, t.[End] 
from 
Import as t 
inner join Varieties as v 
on t.Name like v.Name 
inner join Plots as o 
on t.PlotCode like o.PlotCode) 

insert into Cycle 
(CycleID, PlotID, Product, Variety, Start, [End]) 
Select CycleID, PlotID, Product, Variety, Start, [End] from CTE 
GROUP BY CycleID, PlotID, Product, Variety, Start, End 
関連する問題