2016-06-10 6 views
3

Ich bin in einer Art von Situation, wo ich nicht weiß, wohin ich gehen soll. Ich muss eine Abfrage schreiben, so dass es irgendwie hierarchisch ist.Wie sollte ich beitreten, um dies zu erreichen

Ich werde Ihnen erklären, mit einem Beispiel-

Tabelle A

Hier haben wir 3 Spalten wie dieser

Country  State   City  
    India  Punjab   Amristar  
    India  Punjab   Ludhiana  
    India  Tamil Nadu  Chennai   
    India  Tamil Nadu  Salem 
    India  West Bengal  Kolkata 
    India  West Bengal  Darjeeling 
    India  Maharastra  Mumbai       
    India  Maharastra  Nagpur 

Tabelle B

Hier haben wir 4 Spalten wie diese

Country  State   City   Number 
    India  Punjab  Amristar   3 
    India  Punjab  null    5 
    India  Tamil Nadu Chennai   2  
    India  Tamil Nadu  null   4 
    India  null   null   6 

Nun müssen wir diese beiden Tabellen auf einer hierarchischen Ebene verbinden, wie -

Wenn die beiden Länderspiele, ihre Zustände Spiele und ihre Stadt passt als Nummer ihnen zugewiesenen

Wenn zwei Länderspiele, ihre Zustände Streichhölzer und ihre Stadt stimmt nicht überein (oder ist in einer anderen Tabelle null), dann müssen wir diese Nummer aus Tabelle B zuweisen, wobei die Verbindung zu diesen beiden Tabellen city null und andere zwei Spalten

sind Es ist wie eine Hierarchie Zuerst matchen wir bis zur niedrigsten Granularitätsstufe, wenn das mit dem OK übereinstimmt, wenn nicht auf eine Ebene gehen und so.

Wenn nur die zwei Länder übereinstimmen, müssen wir die Nummer zuweisen, bei der die anderen beiden Spalten null sind.

für die beiden oben genannten Mein Ausgang

Country  State   City    Number 
    India  Punjab  Amristar    3  
    India  Punjab  Ludhiana    5 
    India  Tamil Nadu  Chennai    2 
    India  Tamil Nadu  Salem    4 
    India  West Bengal  Kolkata    6 
    India  West Bengal  Darjeeling   6 
    India  Maharastra  Mumbai    6      
    India  Maharastra  Nagpur    6 

wie this- sein Jetzt habe ich eine approch dies dh sowohl

Zuerst habe ich innere Verknüpfung von ihnen auch zu erreichen und Ziel Säule gefüllt werden wie-

Country  State   City   Number 
    India  Punjab  Amristar   3  
    India  Punjab  Ludhiana   
    India  Tamil Nadu  Chennai   2 
    India  Tamil Nadu  Salem      
    India  West Bengal  Kolkata   
    India  West Bengal  Darjeeling     
    India  Maharastra  Mumbai        
    India  Maharastra  Nagpur 

Jetzt werde ich auf der Grundlage von Land und Staat beitreten und mit Bedingung

dieses Ziel sollte in Tabelle A und Stadt nicht gefüllt ist null in Tabelle B

Welche this-

Country  State   City   Number 
    India  Punjab  Amristar   3  
    India  Punjab  Ludhiana   5 
    India  Tamil Nadu  Chennai   2 
    India  Tamil Nadu  Salem    4   
    India  West Bengal  Kolkata   
    India  West Bengal  Darjeeling     
    India  Maharastra  Mumbai        
    India  Maharastra  Nagpur 

Jetzt wird ich mich auf Länderbasis beitreten werden und wo das Tor ist leer in Tabelle A und Zustand ist null in Tabelle B

die wir wie sein this-

Country  State   City    Number 
     India  Punjab  Amristar   3  
     India  Punjab  Ludhiana   5 
     India  Tamil Nadu  Chennai   2 
     India  Tamil Nadu  Salem    4   
     India  West Bengal  Kolkata   6 
     India  West Bengal  Darjeeling   6  
     India  Maharastra  Mumbai    6     
     India  Maharastra  Nagpur    6 

Das ist, was ich will schließlich

Jetzt ein Problem mit dieser Annäherung ist es basierend auf Update. Aber hier muss ich wählen.

Wie schreibe ich dies in sql. Das ist mein Problem.

Bitte kann mir hier jemand helfen.

Antwort

4

Es kann leicht mehrere LEFT JOINS auf verschiedenen Kriterien erfolgen:

DECLARE @Countries TABLE 
(
    [Country] VARCHAR(12) 
    ,[State] VARCHAR(16) 
    ,[City] VARCHAR(16) 
); 

INSERT INTO @Countries ([Country], [State], [City]) 
VALUES ('India', 'Punjab', 'Amristar') 
     ,('India', 'Punjab', 'Ludhiana ') 
     ,('India', 'Tamil Nadu', 'Chennai ') 
     ,('India', 'Tamil Nadu', 'Salem ') 
     ,('India', 'West Bengal', 'Kolkata ') 
     ,('India', 'West Bengal', 'Darjeeling') 
     ,('India', 'Maharastra', 'Mumbai') 
     ,('India', 'Maharastra', 'Nagpur'); 

DECLARE @CountriesCodes TABLE 
(
    [Country] VARCHAR(12) 
    ,[State] VARCHAR(16) 
    ,[City] VARCHAR(16) 
    ,[Number] TINYINT 
); 

INSERT INTO @CountriesCodes ([Country], [State], [City], [Number]) 
VALUES ('India', 'Punjab', ' Amristar', '3') 
    ,('India', 'Punjab', NULL, '5') 
    ,('India', 'Tamil Nadu', 'Chennai', '2') 
    ,('India', 'Tamil Nadu', NULL, '4') 
    ,('India', NULL, NULL, '6'); 

SELECT C.[Country] 
     ,C.[State] 
     ,C.[City] 
     ,COALESCE(CC1.[Number], CC2.[Number], CC3.[Number]) AS [Number] 
FROM @Countries C 
LEFT JOIN @CountriesCodes CC1 
    ON C.[Country] = CC1.[Country] 
    AND C.[State] = CC1.[State] 
    AND C.[City] = CC1.[City] 
LEFT JOIN @CountriesCodes CC2 
    ON C.[Country] = CC2.[Country] 
    AND C.[State] = CC2.[State] 
    AND CC2.[City] IS NULL 
LEFT JOIN @CountriesCodes CC3 
    ON C.[Country] = CC3.[Country] 
    AND CC3.[State] IS NULL 
    AND CC3.[City] IS NULL; 

enter image description here

Nun lassen Sie uns sagen, dass es zusätzliche Spalte Number in der ersten Tabelle, die Sie aktualisieren möchten (Ich denke, das ist was du willst):

UPDATE @Countries 
SET [Number] = COALESCE(CC1.[Number], CC2.[Number], CC3.[Number]) 
FROM @Countries C 
LEFT JOIN @CountriesCodes CC1 
    ON C.[Country] = CC1.[Country] 
    AND C.[State] = CC1.[State] 
    AND C.[City] = CC1.[City] 
LEFT JOIN @CountriesCodes CC2 
    ON C.[Country] = CC2.[Country] 
    AND C.[State] = CC2.[State] 
    AND CC2.[City] IS NULL 
LEFT JOIN @CountriesCodes CC3 
    ON C.[Country] = CC3.[Country] 
    AND CC3.[State] IS NULL 
    AND CC3.[City] IS NULL; 
Verwandte Themen