2016-08-18 4 views
3

Ich versuche im Wesentlichen, einzelne Datensätze in basierend auf Informationen in tableB zu verbinden. Wenn ich mehr als ein Ergebnis mit den ursprünglichen Beitrittsbedingungen erhalte, füge ich mehr hinzu und führe die Abfrage erneut aus. Wenn ich keine Ergebnisse bekomme, wird nichts übertragen. Beispiel: Suche nach a.FRST_NM = b.FRST_NM. Wenn ein Ergebnis, ziehen Sie den Datensatz. Wenn mehr als eins, fügen Sie LAST_NM hinzu und wenn ein Ergebnis, ziehen Sie diesen Datensatz. So weiter und so weiter, bis ich einen Rekord habe. Ich kann eins nach dem anderen machen, aber das passiert 2 oder 3 mal pro Durchgang.Eine Suche ausführen, um Mitglied zu identifizieren

Dies liegt daran, dass einige Felder in der einen Tabelle nicht ausgefüllt sind, sondern in der anderen. Ich weiß nur nicht, wie man Join-Bedingungen hinzufügt, ohne die gesamte FROM-Anweisung neu zu schreiben, oder wie man nur den Datensatz zieht, wenn es nur ein Ergebnis gibt.

IF(CONDITION_1 from JOIN_1) = 1 result THEN a.field_1 = b.field_1 and a.field_2 = b.field_2 

IF (CONDITION_1 from JOIN_1) > 1 result THEN (additional joining conditions + JOIN_1) as JOIN_1a 

ELSE IF(CONDITION_1 from JOIN_1a) = 1 result then a.field_1 = b.field_1 and a.field_2 = b.field_2 

IF(CONDITION_1 from JOIN_1) = 0 results then NO MOVE 

--(Repeat with different tables and joining conditions)-- 

Antwort

1

Hmmm. Eine Methode wäre, sich auf einem Feld zu verbinden und dann basierend auf den anderen Feldern zu priorisieren. Eine andere wäre left join zu verwenden. Das würde wie folgt aussehen:

select t1.*, coalesce(t2a.col, t2b.col, t2c.col) as col 
from t1 left join 
    t2 t2a 
    on t1.col1 = t2a.col1 and t1.col2 = t2a.col2 and t1.col3 = t2a.col3 left join 
    t2 t2b 
    on t1.col1 = t2b.col1 and t1.col2 = t2b.col2 and t2b.col1 is null left join 
    t2 t2c 
    on t1.col1 = t2c.col1 and t2b.col1 is null; 
1
SELECT * 
FROM (
    SELECT 
     * 
     ,CASE WHEN a.LAST_NM = b.LAST_NM THEN 'matched' ELSE 'not matched' END LastNameMatchedExample 
     ,ROW_NUMBER() OVER (PARTITION BY 1 ORDER BY 
       CASE 
        WHEN a.LAST_NM = b.LAST_NM AND a.Field1 = b.Field1 AND a.Field2 = b.Field2 AND a.Field3 = b.Field3 THEN 0 
        WHEN a.LAST_NM = b.LAST_NM AND a.Field1 = b.Field1 AND a.Field2 = b.Field2 THEN 1 
        WHEN a.LAST_NM = b.LAST_NM AND a.Field1 = b.Field1 THEN 2 
        WHEN a.LAST_NM = b.LAST_NM THEN 3 
        ELSE 4 
       END 
      ) as RowNumber 
    FROM 
     TableA a 
     INNER JOIN TableB b 
     ON a.FIRST_NM = b.FIRST_NM 
    ) results 
WHERE 
    results.RowNumber = 1 

Also im Grunde ist es eine Suche nur auf den First_NM Kriterien und dann baut und ORDER BY-Liste, die Ihnen die genaue Aufzeichnung Sie wollen wählen können, basierend auf, wenn diese übereinstimmt und diese passt und das passt usw. Also egal wie viele Datensätze zurückgegeben werden, können Sie dann das erste Ergebnis erhalten. Da alles aus den gleichen 2 Tabellen kommt, sollten Sie immer die größtmögliche Anzahl von Spalten verwalten und Sie können CASE STATEMENTS verwenden, um einen Wert NULL zu erhalten, wenn keine Übereinstimmung usw.

unten ist eine ähnliche Methode, die ein Vorrang vor dem Feld, aber irgendwie behandelt es OR-Bedingung mit anderen übereinstimmenden Feldern. In diesem Beispiel wird es nach der Existenz einer Übereinstimmungs-Existenz einer Übereinstimmung usw. sortieren und alle Ihre Aussagen durchgehen. Wo es von oben abweichen wird sagen, dass keine LAST_NM Übereinstimmung auftritt, aber auf einem Datensatz eine Feld1 Übereinstimmung auftritt und auf einem anderen es nicht macht Feld1 ein höheres Ergebnis entsprechen.

SELECT * 
FROM (
    SELECT 
     * 
     ,CASE WHEN a.LAST_NM = b.LAST_NM THEN 'matched' ELSE 'not matched' END LastNameMatchedExample 
     ,ROW_NUMBER() OVER (PARTITION BY 1 ORDER BY 
       CASE WHEN a.LAST_NM = b.LAST_NM THEN 0 ELSE 1 END 
       ,CASE WHEN a.Field1 = b.Field1 THEN 0 ELSE 1 END 
       ,CASE WHEN a.Field2 = b.Field2 THEN 0 ELSE 1 END 
       ,CASE WHEN a.Field3 = b.Field3 THEN 0 ELSE 1 END 
      ) 
    FROM 
     TableA a 
     INNER JOIN TableB b 
     ON a.FIRST_NM = b.FIRST_NM 
    ) results 
WHERE 
    results.RowNumber = 1 
+0

Also anstatt die Fügebedingungen zu ändern, würde ich stattdessen CASE-Ausdrücke machen? Das klingt tatsächlich einfacher. Besonders, da in den späteren Pässen einige Tabellen entfernt werden und andere an ihrer Stelle hinzugefügt werden. –

+0

Dies setzt voraus, dass alle Tabellen, die Sie durchsuchen möchten, am Anfang als LEFT JOINs verknüpft sind. Wählen Sie dann den gewünschten Datensatz aus, indem Sie die Priorität roze_number() auf Basis von case-Anweisungen festlegen. Aber Sie müssen immer noch alle Tabellen am Anfang verbunden haben ... – Matt

+0

Dies funktioniert für den ersten Durchlauf, aber die späteren Durchgänge haben mich Tabellen entfernen und verbinden mit anderen zu laufen, wenn es> 1 oder = 0 Ergebnisse gibt. –

Verwandte Themen