2016-09-28 2 views
-2

So schreibe ich in eine Tabelle die Ausgabe von einigen sequentiellen CTEs, und wenn ich eine Verknüpfung in einem der CTEs von einem inneren zu einem linken Join behoben, gibt es jetzt duplizierte Einträge in der Tabelle, die nicht angezeigt werden, wenn ich nur die Abfrage ohne die Einfügung ausführen.SQL Server 2012 doppelte Einträge in Tabelle schreiben von CTE

Muss ich etwas über das Erstellen und Einfügen in eine Tabelle in Bezug auf Joins in einem CTE wissen?

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 

Wenn auf der inneren Erstellen der Tabelle kommen gibt es kein Problem mit Dubletten; Auf dem linken Join (wie oben gezeigt) scheinen Zeilen, in denen NULL-Werte vorkommen, mehrfach zu duplizieren.

+0

Wenn Sie Hilfe bei der Fehlerbehebung benötigen, dann müssen Sie tatsächlich den Code einfügen, der problematisch ist, und Sie sollten in der Regel Beispieldaten und das gewünschte Ergebnis auch enthalten. http://meta.stackoverflow.com/questions/271055/tips-for-asking-a-good-structured-query-language-sql-question/271056 – Matt

+0

Es scheint, dass Sie Datensätze in der linken Seitentabelle haben, die nicht entsprechende Datensätze in der rechten Seitentabelle. Wenn Sie also LEFT JOIN verwenden, kommen alle Datensätze von der linken Seite, aber wenn Sie INNER JOIN verwenden, werden sie ausgeblendet. –

Antwort

0

Überprüfen Sie Ihre rechte Tabelle (Tabelle2) meine Vermutung ist, dass es mehr als einen Datensatz gibt, die die gleiche ID und das gleiche Datum haben.

Wenn dies der Fall ist, sind die Datensätze technisch nicht dupliziert, wenn Sie alle (*) im CTE auswählen, sehen Sie die anderen Felder, die sich geändert haben.

Wenn Sie sich nicht darum kümmern, dass der Rest der Felder anders ist, versuchen Sie einfach eine Row_Number zu Ihrem CTE hinzuzufügen und wählen Sie, wo die Row_Number = 1 außerhalb des CTE ist.

Zum Beispiel:

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 

Die row_number wirkt als „distinct“ und je nachdem, welche Kombination von Feldern Sie wollen nicht duplizieren, werden Sie unterschiedliche Ergebnisse erhalten.

Zum Beispiel, wenn Sie die IDs nicht wollen, zu vervielfältigen, dann

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

, wenn Sie nicht über die IDs duplizieren egal, aber Sie haben nicht die gleiche ID am selben Tag wollen, dann

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

etc .... hängt nur von Ihren Auswahlkriterien von dem ab, was Sie nicht duplizieren möchten. Hoffe, das hilft