2011-01-13 11 views
0

Ich versuche, Tabelle A, eindeutige Daten aus Tabelle B, die Daten in TAble C übereinstimmt, aber ich bekomme immer die Verletzung von Primärschlüssel Fehler und nicht sicher was ich tue, falsch eine Tabelle - bookfeed Tabelle B - bookF Tabelle C - bookStatsSQL Server Daten von Tabelle1 zu Tabelle2 einfügen wo Tabelle1 = Tabelle3 Daten

INSERT INTO bookFeed 
(entryId,feed,entryContent,pubDate,authorName,authorId,age, 
    sex,locale,pic,fanPage, faceTitle,feedtype,searchterm,clientId,dateadded) 
SELECT DISTINCT b.entryId,b.feed,b.entryContent,b.pubDate,b.authorName, 
    b.authorId,b.age,b.sex,b.locale,b.pic,b.fanPage,b.faceTitle,b.feedtype, 
    b.searchterm, b.clientId,b.dateadded 
    FROM bookF as b 
    INNER JOIN bookStats as a on a.feed = b.feed 
     WHERE NOT EXISTS (SELECT * 
          FROM bookFeed as c 
          WHERE c.entryId = b.entryId) 

Tabelle A bookFeed hat einen Primärschlüssel auf entryId

Antwort

2

Es sieht aus wie in Tabelle bookF, es gibt doppelte Datensätze pro EintragId Wenn Sie nur eine entryId (begrenzt durch PK auf bookFeed) wollen, können Sie dies verwenden. Passen Sie die Reihenfolge an in der ROW_NUMBER an

insert into bookFeed (
    entryId,feed,entryContent,pubDate,authorName,authorId,age, 
    sex,locale,pic,fanPage,faceTitle,feedtype,searchterm,clientId,dateadded) 
select 
    entryId,feed,entryContent,pubDate,authorName,authorId,age, 
    sex,locale,pic,fanPage,faceTitle,feedtype,searchterm, clientId,dateadded 
from 
(
    select rn=Row_number() over (partition by b.entryId order by b.entryId), 
     b.entryId,b.feed,b.entryContent,b.pubDate,b.authorName,b.authorId,b.age, 
     b.sex,b.locale,b.pic,b.fanPage,b.faceTitle,b.feedtype,b.searchterm, b.clientId,b.dateadded 
    from bookF as b 
    inner join bookStats as a on a.feed = b.feed 
    left join bookFeed as c on c.entryId=b.entryId 
    where c.entryId is null 
) X 
where rn=1 
+0

Vielen Dank, das hat perfekt funktioniert. – vbNewbie

1

UPDATE: Versuchen Sie das für Sie abfragen und sehen, ob es funktioniert, schauen Sie sich die Daten an und sehen Sie, ob es Dubletten gibt, was bedeutet, dass alle Einträge ein e haben sollten ntry id anders als das, was zur Zeit gibt es -

SELECT b.entryId,b.feed,b.entryContent,b.pubDate,b.authorName, 
    b.authorId,b.age,b.sex,b.locale,b.pic,b.fanPage,b.faceTitle,b.feedtype, 
    b.searchterm, b.clientId,b.dateadded 
    FROM bookF as b 
    INNER JOIN bookStats as a on a.feed = b.feed 
     WHERE b.entryId IN (SELECT distinct entryid 
          FROM bookFeed) 

Ich glaube, Sie versuchen, einen Eintrag ID einfügen, das ein Primärschlüssel ist (überprüfen, ob der Wert einfügen möchten, ist kein Duplikat, null oder verletzt andere von Primärschlüssel Einschränkung) ... also versuchen Sie nicht, es einzufügen, wenn es automatisch gefüllt wird oder wenn Sie es einfügen möchten, dann aktivieren Sie die Identität einfügen .. und versuchen Sie es erneut ...

Aber im Idealfall Ihre ID sollte berechnet werden (auto increment oder so) und niemals direkt eingefügt werden.

+0

Entschuldigung, das sollte für mich offensichtlich gewesen sein. Ich dachte, das war es, aber ich wollte nur, dass es alle Duplikate überspringt und alle anderen Daten einfügt. Deshalb habe ich versucht, distinct zu verwenden, aber ich denke, es gab identische entryIds, aber mit anderen Feldern. Danke – vbNewbie

+0

Diese Antwort scheint nicht das Problem des Imports/Transfers zwischen Tabellen, die ID erhalten, zu adressieren, worüber sich die Frage zu stellen scheint. Ihr Punkt ist über Identitätsspalten und neue Daten, die auf altem trampeln, von denen keiner das Problem zu sein scheint. – RichardTheKiwi

Verwandte Themen