2016-07-26 13 views
1

Gibt es analytische Konsequenzen für JOIN eine Tabelle zu sich selbst ON eine Spalte, die keine eindeutigen Werte enthält?Self-Join auf einer Nicht-Key-Spalte

Die meisten Self-Join-Abfragen, die ich gesehen habe, werden auf einer PK-Spalte durchgeführt. Ich habe Probleme bekommen, meine Zahlen richtigzustellen, also frage ich mich, ob das, was ich tue, Sinn macht.

z.

SELECT * 
FROM Employee a 
JOIN Employee b 
ON a.Birthdate = b.Birthdate 
+1

Definiere _analytische Konsequenzen_? Du hast erwähnt, dass du Probleme hast, was sind sie? –

+0

@ JonathonOgden dies ist eine ausführlichere Version meiner Frage: http://stackoverflow.com/questions/38377403/self-join-produces-inconsistent-value-for-last-month – Disasterkid

+0

Grob gesagt, da es ein nicht-einzigartig ist Spalte, Sie werden natürlich Aufzeichnungen zu sich selbst beitreten. Ein Mitarbeiterdatensatz in A wird sich also in B ohne eine zusätzliche eindeutige Schlüsselspalte, wie z. B. eine Mitarbeiter-ID, zum Filtern derselben einfügen. Welche Analyse werden Sie für diese Daten durchführen? Das wird Ihnen helfen, eine spezifischere Antwort zu geben. –

Antwort

1

Wie Ihre Abfrage jetzt geschrieben wird, wird es Sie alle Paare von Mitarbeitern zurückgeben, dass:

  1. Unterschiedliche Mitarbeiterdaten, die den gleichen Geburtstag haben
  2. Alle Mitarbeiter Datensätze werden selbst verknüpft zurückgegeben werden

Ich glaube nicht, dass dies jemals viel Sinn machen würde. Können Sie mehr Informationen dazu liefern, was Sie erreichen möchten und wie die Employee-Tabelle aufgebaut ist?

Bei Birthdate NULL-Werte zulässt, dann werden Sie die ON Klausel ändern müssen NULL Werte als auch beispielsweise verbinden:

SELECT * 
FROM Employee a 
JOIN Employee b 
ON COALESCE(a.Birthdate,'19000101') = COALESCE(b.Birthdate,'19000101') 
+0

NULL Fall sollte erwähnt werden – Serg

0

SQL INNER JOIN, CROSS & implizite JOIN (Komma) alle Ergebnis JOIN in dem können wir ein SQL- "Kreuzprodukt" jeder möglichen Verkettung einer linken Argumentzeile mit einer rechten Argumentzeile (mit Spalten, die pro Quellentabellenalias umbenannt wurden) nennen. Im Fall von INNER JOIN löscht ON alle Ergebniszeilen, die ihre Bedingung nicht erfüllen. (So ​​ist INNER JOIN ON 1 = 1 dasselbe wie CROSS & implizite JOIN. Dies ist auch das Ergebnis für Dialekte, die INNER JOIN ohne ON erlauben.) Dies ist unabhängig davon, was NULL in einer Tabelle sein darf.

Siehe this (dialect-independent) answer explaining INNER/CROSS/implicit JOINs. Das erklärt auch, dass alle JOIN "Sinn macht". (Obwohl SQL-Bedeutungen für nicht-relationale SQL-Tabellen (solche mit NULLS oder doppelte Zeilen) komplex und undurchsichtig sind.) Natürlich macht die Verwendung der falschen Abfrage keinen Sinn.

PS Sie möchten wahrscheinlich nur eindeutige Zeilen auswählen. Wahrscheinlich möchten Sie die Zeilen WHERE a.employee = a.employee nicht. Und Sie wollen nicht, für Spalten (a.employee, ..., b.employee, ...), sowohl die Zeile (x, ..., y, ...) und die Zeile (y, ..) ., x, ...), für die die übliche Lösung etwas wie WHERE a. employee <= b.employee ist. Aber Sie müssen die Bedeutung der Eingabetabelle und der Ergebnistabelle wissen, bevor Sie eine entsprechende Abfrage schreiben können.