2016-09-28 55 views
-2

因此,我正在写一个表,从几个顺序CTE的输出,并且当我从内部连接到左连接中的某个CTE中加入连接时,现在有如果我只是在没有插入的情况下运行查询,表中没有显示的重复条目。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

检查您的右表(表2)我的猜测是有多个记录具有相同的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复制,然后

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) 

etc ....只是取决于你不想复制的选择标准。 希望这可以帮助