2016-07-12 1 views
0

source_tbl: EMAIL_ADDR, RolleIst das Abfrageergebnis der ausgewählten Unterabfrage statisch in einem T-Sql Into in select ..?

target_tbl: EMAIL_ADDR, Rollen

source_tbl können viele E-Mail-Adressen haben. target_tbl kann eine eindeutige E-Mail-Adresse (die Rolle in source_tbl in Rollen in target_tbl konsolidiert - gerade FYI)

Meine Sorge ist das Duplizieren keine E-Mail-Adresse in target_tbl (keine Einschränkungen sind anstelle von dba-Setup)

Ich habe den Verdacht, dass die Unterabfrage in einem Insert in Select einmal ausgeführt wird und diese Ergebnismenge dann vom Insert verwendet wird. Wenn dies der Fall ist, dann wird eine Abfrage wie das wird nicht funktionieren:

insert into target_tbl 
(email_addr, roles) 
select 
src.email_addr, 
src.role 
from source_tbl src 
where src.email_address not in (select email_addr from target_tbl) 

nichts finden können, dass mein Verdacht bestätigt, zu überprüfen, ob jemand mich auf die Dokumentation verweisen kann, dass mir diese Bestätigung gibt

+1

Können Sie ein wenig Informationen über die Rollen bereitstellen. Ich denke, dass Sie in der Lage sein könnten, zu schwenken und zu verschmelzen, und dort eine Handvoll anderer Lösungen, die viele Zeilen in eine 1-Zeilen-Beziehung bringen würden. Können Sie einige Beispieldaten in Ihrer Frage angeben, damit wir eine Antwort für Sie ausrichten können. Hinweis: Sie können sich auch Ihren Ausführungsplan ansehen, um zu sehen, ob die Schleife pro Zeile ausgeführt wird oder ob eine einzelne Suche von target_tbl ausgeführt wird. Ich vermute, dass diese Abfrage nicht RBAR ist. –

+0

Warum brauchen Sie Dokumentation von etwas, das Sie leicht durch Testen überprüfen können? –

+0

Danke für die Pivot Lead - das war ein anderes Problem, auf das ich nach meiner anfänglichen Frage @MattA stoßen würde. – mmv1219

Antwort

1

Fragen Sie, ob die folgende Unterabfrage für jede Zeile neu ausgewertet wird, und berücksichtigt daher E-Mail-Adressen, die zuvor von derselben Anweisung hinzugefügt wurden?

where src.email_address not in (select email_addr from target_tbl) 

Wenn ja, ist die Antwort "Nein".

Es wird am Anfang ausgewertet und irgendwo als Ergebnis von Halloween Protection gespoolt (es sei denn, SQL Server schafft einen Plan, der diese Semantik ohne eine Spool garantiert, aber die Antwort ist immer noch die gleiche).

Wenn also die Abfrage SELECT beispielsweise 3 Zeilen für [email protected] zurückgibt und diese E-Mail-Adresse nicht bereits in der Zieltabelle vorhanden ist, werden alle drei Zeilen eingefügt.

Sie können entweder die einzigen SELECT ändern per E-Mail eine Zeile zu holen oder eine eindeutige Einschränkung auf die Tabelle mit ignore_dup_key auf in der nur die ersten (willkürlichen) einen angetroffen zu bewahren. Wahrscheinlich ist die erste Option nützlicher, da Sie kontrollieren können, welche davon beibehalten wird.

+0

Danke, das habe ich gebraucht – mmv1219