2016-06-17 3 views
0

Ich habe 3 Tabellen (Sya A, B und C) und sie haben 9 gemeinsame Spalten (ID_number, Firma, Rolle, Seq_number, FirstName, MiddleName, LastName , Geschlecht & DOB) zwischen ihnen.Abfrage für Abrufen nicht übereinstimmender Datensätze aus einer Tabelle durch Gegenprüfung mit 2 anderen Tabellen

Tabelle A hat 2 Arten von Datensätzen

  1. Datensätze aus der Tabelle B oder C
  2. Aufzeichnungen, die & C nicht aus der Tabelle B sind

Jetzt möchte ich nur die Datensätze in vergleichen Tabelle A, die aus Tabelle B & C mit den Datensätzen stammen, die in Tabelle B & C basierend auf diesen 9 gemeinsamen Spalten verfügbar sind. Es kann einen Unterschied in den Daten einer gemeinsamen Spalte zwischen den Datensätzen in der Tabelle A & (Tabelle B oder C) geben. Ich möchte nur diesen bestimmten Datensatz auswählen.

Beispiel:

Tabelle A

ID_Number company Role Seq_Number FirstName MiddleName LastName Gender DOB  system city state country 
1234  12  OWN 1   Test1  mid1  last1 F  1979-01-26 ABC YYY ZZZ IND 

Tabelle B oder C

ID_Number company Role Seq_Number FirstName MiddleName LastName Gender DOB  System address 
1234  12  OWN 1   Test1  mid1  last1 F  1990-08-30 ABC IND 

In dem obigen Beispiel wird jeder der gemeinsamen Spalte miteinander verglichen. Nur die Spalte DOB unterscheidet sich. Daher muss ich diesen Rekord melden. Wenn die Daten in einer dieser allgemeinen Spalten nicht übereinstimmen, muss ich diese Datensätze ebenfalls abrufen. Ich habe versucht, mit Filterbedingungen die linke Verknüpfung zwischen A, B und C herzustellen. Aber es funktioniert nicht wie erwartet.

Auch eine Spalte (say type) ist in Tabelle A nicht verfügbar. Aber in Tabellen verfügbar B & C. Ich muss den Wert dieser Spalte aus Tabelle B oder C für Tabelle A ableiten, während der nicht übereinstimmende Datensatz abgerufen wird . Bei der Verwendung von linkem Join zum Abrufen des nicht übereinstimmenden Datensatzes habe ich versucht, den Spaltenwert "type" von B oder C mit case/ISNULL/COALSCE abzurufen (da die Datensätze in Tabelle A entweder von B oder C stammen). Aber ich bekomme nur NULL-Werte, obwohl die Spalte einen Wert in B oder C hat.

Tabelle B & C sind die Basis für Tabelle A. So die Tabelle A hat Datensätze entweder von B oder C. Spalten (ID_Number, Firma , Rolle & seq_number) sind Primärschlüssel für alle 3 Tabellen und sie bleiben gleich. Nur die verbleibenden Felder ändern sich. Ich habe versucht, wie folgt. Es holt Datensätze, die aus Tabelle A, die nicht in Tabelle B oder C auch verfügbar sind. Aber, müssen nur die nicht übereinstimmen Datensätze von A in B oder C holen

SELECT ALC.ID_Number ,ALC.Role ,ALC.Seq_Number ,CASE WHEN BPC.Type IS NULL THEN CPC.Type ELSE BPC.Type END --,FAT_Cust.FATCA_PolicyOwner_Type AS Client_Type ,ALC.FirstName AS First_Name ,ALC.MiddleName AS Middle_Name ,ALC.LastName AS Last_Name ,ALC.Gender ,ALC.Date_Of_Birth AS DOB FROM AL_Customer ALC LEFT JOIN BL_Customer BPC ON ALC.NAME = BPC.NAME AND ALC.Company = BPC.Company AND ALC.ROLE = BPC.ROLE AND ALC.Seq_Number = BPC.Seq_Number AND ALC.FirstName = BPC.FirstName AND ALC.MiddleName = BPC.MiddleName AND ALC.LastName = BPC.LastName AND ALC.Gender = BPC.Gender AND ALC.DOB = BPC.DOB AND ALC.Record_Active = 1 LEFT JOIN CL_Customer CPC ON ALC.NAME = CPC.NAME AND ALC.Company = CPC.Company AND ALC.ROLE = CPC.ROLE AND ALC.Seq_Number = CPC.Seq_Number AND ALC.FirstName = CPC.FirstName AND ALC.MiddleName = CPC.MiddleName AND ALC.LastName = CPC.LastName AND ALC.Gender = CPC.Gender AND ALC.DOB = CPC.DOB AND ALC.Record_Active = 1 WHERE ALC.Record_Active = 1 AND (BPC.NAME IS NULL AND CPC.NAME IS NULL) AND (BPC.ROLE IS NULL AND CPC.ROLE IS NULL) AND (BPC.Seq_Number IS NULL AND CPC.Seq_Number IS NULL) AND (BPC.FirstName IS NULL AND CPC.FirstName IS NULL) AND (BPC.MiddleName IS NULL AND CPC.MiddleName IS NULL) AND (BPC.LastName IS NULL AND CPC.LastName IS NULL) AND (BPC.Gender IS NULL AND CPC.Gender IS NULL) AND (BPC.DOB IS NULL AND CPC.DOB IS NULL) AND ALC. Record_Active =1 AND (ALC.UpdatedDate BETWEEN DATEADD(DAY, -7, GETDATE()) AND GETDATE()) 
+0

Wie kann man sagen, dass ein Datensatz von A ist auch in B oder C. Ist die ID_Number immer gleich? Kannst du uns auch zeigen, was du versucht hast und erklären, wie es nicht wie erwartet funktioniert hat? –

+0

Auch eine Spalte (sagen Typ) ist nicht verfügbar in Tabelle A. Aber verfügbar in Tabellen sowohl B und C. Ich muss den Wert dieser Spalte von Tabelle B oder C für Tabelle A ableiten, während Sie den nicht übereinstimmenden Datensatz abrufen. Bei der Verwendung von linkem Join zum Abrufen des nicht übereinstimmenden Datensatzes habe ich versucht, den Spaltenwert "type" von B oder C mit case/ISNULL/COALSCE abzurufen (da die Datensätze in Tabelle A entweder von B oder C stammen). Aber ich bekomme nur NULL-Werte, obwohl die Spalte einen Wert in B oder C hat. –

+0

Tabelle B & C sind die Basis für Tabelle A. So enthält die Tabelle A Datensätze entweder von B oder C. Spalten (ID_Number, Firma, Rolle & Seq_number) sind Primärschlüssel für alle 3 Tabellen und sie bleiben gleich. Nur die verbleibenden Felder ändern sich. Ich habe versucht, wie folgt. Es holt Datensätze, die aus Tabelle A, die nicht in Tabelle B oder C auch verfügbar sind. Aber, müssen nur die nicht übereinstimmen Datensätze von A in B oder C –

Antwort

0

Ich glaube, das sollte dir helfen oder zumindest geben Ihnen eine Idee:

;WITH BC as (SELECT * FROM B UNION ALL SELECT * FROM C) 
SELECT * 
FROM BC LEFT JOIN A 
ON BC.ID_number = A.ID_number and BC.company = A.company and 
    BC.Role = A.Role and BC.Seq_number = A.Seq_number 
WHERE A.ID_number Is Null or 
    HASHBYTES('SHA2_256', IsNull(BC.FirstName,'') + IsNull(BC.MiddleName,'') + IsNull(BC.LastName,'') + IsNull(BC.Gender,'') + IsNull(CAST(BC.DOB as VARCHAR),'')) != 
    HASHBYTES('SHA2_256', IsNull(A.FirstName,'') + IsNull(A.MiddleName,'') + IsNull(A.LastName,'') + IsNull(A.Gender,'') + IsNull(CAST(A.DOB as VARCHAR),'')) 
Verwandte Themen