SQL Server 2012将重复的条目从CTE写入表中

时间:2016-09-28 17:00:28

标签: sql sql-server tsql

所以我正在向一个表写入几个连续CTE的输出,当我在一个CTE中从内连接到左连接修复连接时,表中现在有重复的条目没有显示如果我只是在没有插入的情况下运行查询。

我是否需要了解有关在CTE中创建和插入关于连接的表的信息?

修改

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的行似乎多次重复。

1 个答案:

答案 0 :(得分:0)

检查你的右表(表2)我的猜测是有多个记录具有相同的ID和日期。

如果是这种情况,如果您在CTE中选择全部(*),则技术上不会重复记录,您将看到其他已更改的字段。

如果你不关心其他字段是不同的,只需尝试将一个Row_Number添加到你的CTE并选择在CTE之外Row_Number = 1的位置。

For Instance:

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充当" distinct"并且根据您想要不重复的字段组合,您将得到不同的结果。

例如,如果您不希望ID重复,那么

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

如果您不关心ID重复,但您不希望在同一日期使用相同的ID,那么

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

等....只取决于你不想复制的选择标准。 希望这有帮助