2016-06-10 5 views
3

Я в такой ситуации, когда не знаю, куда идти. Я должен написать такой запрос, чтобы он был иерархическим.Как я могу присоединиться к достижению этого

Я объясню вам с ПРИМЕР-

таблицы А

Здесь мы имеем 3 колонки, как этот

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 

Таблица B

Здесь мы имеем 4 колонки, как это

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 

Теперь мы должны соединить эти две таблиц на уровне иерархии, как -

Если две стран спички, их состояние спичка и их город спичка, чем номер, присвоенных им

Если две страны совпадают, их состояние спичек и их Город не соответствует (или он является нулевым в другой таблице), тогда мы должны назначить это число из таблицы B, в котором объединение этих двух таблиц города будет нулевым, а два других столбца соответствуют

Это похоже на иерархию сначала мы запустим до самого низкого уровня граничности, если это соответствует его окну, если не перейти на один уровень вверх и вот так.

Если встречаются только две страны, мы должны назначить номер, где остальные два столбца равны нулю.

Мой выход для выше двух будет как 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 

Теперь у меня есть Approch для достижения этой цели также есть,

Сначала я внутреннее соединение обоих и целевой столбец будет заполнена как-

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 

Теперь я присоединюсь на основе страны и государства, и с условием

, что цель не должна заполнены в таблице А и город является недействительным в таблице B.

Который даст мне 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 

Теперь я присоединюсь на национальной основе и где целью является пустым в таблице А и состояние нуль в таблице B

который мы быть как 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 

Это то, что я хочу, в конце концов,

Теперь проблема с этим утверждением основана на обновлении. Но здесь я должен сделать выбор.

Как это записать в sql. Это моя проблема.

Пожалуйста, помогите мне здесь.

ответ

4

Это можно легко сделать с помощью нескольких LEFT JOINS по различным критериям:

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

Теперь, скажем, есть дополнительный столбец Number в первой таблице, которую вы хотите обновить (я предполагаю, что это это то, что вы хотите):

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; 
Смежные вопросы