Ich habe die Situation:
%Vor%Da sich Unternehmen im Laufe der Zeit verschieben können, führt ein LEFT JOIN dazu, dass mehrere Datensätze für jedes Unternehmen erstellt werden.
Die Felder begin
und end
sind niemals NULL. Um die letzte Adresse zu finden, verwenden Sie ORDER BY being DESC
. Um ältere Adressen zu entfernen, verwenden Sie LIMIT 1
.
Das funktioniert gut, wenn die Abfrage nur 1 Firma bringen kann. Aber ich brauche eine Abfrage, die alle Table1-Datensätze mit ihren aktuellen Table2-Adressen verknüpft. Daher muss die Entfernung veralteter Daten (AFAIK) in der ON-Klausel von LEFT JOIN erfolgen.
Irgendeine Idee, wie ich die Klausel erstellen kann, um nicht doppelte Table1-Firmen zu erstellen und neueste Adresse zu bringen?
Ich habe es mit der Windows-Funktion gelöst:
%Vor% row_number () erstellt einen int-Zähler für jeden Datensatz innerhalb jedes auf fk_company basierenden Fensters. Für jedes Fenster kommt der Datensatz mit dem spätesten Datum zuerst mit Rang 1, dann stellt dt_last_addr = 1
sicher, dass der JOIN nur einmal für jeden fk_company
auftritt, mit dem Datensatz mit der letzten Adresse.
Window-Funktionen sind sehr mächtig und wenige ppl verwenden sie, sie vermeiden viele komplexe Joins und Unterabfragen!
Verwenden Sie eine abhängige Unterabfrage mit der Funktion max () in einer Join-Bedingung.
Etwas wie in diesem Beispiel:
demo: Ссылка
Tags und Links postgresql left-join foreign-key-relationship sql-order-by duplicate-removal