我应该如何加入以实现这一目标

时间:2016-06-10 05:52:56

标签: sql sql-server sql-server-2008 join

我处于一种我不知道去哪里的情况。我必须编写一个查询,使其具有层次结构。

我将用一个例子来解释你 -

表A

这里我们有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中分配该数字,从而加入这两个表城市将为空,其他两列匹配

它就像一个层次结构,我们首先达到最低的粒度级别,如果匹配它的确定,如果没有达到一级并且像这样。

如果只有两个国家匹配,我们必须分配其他两列为空的数字。

上面两个的输出将是这样的 -

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

现在我将根据国家和州以及条件

加入

表A中不应填写该目标,表B中的City为空。

哪个会给我这个 -

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

现在我将以国家为基础加入,表A中的目标为空,表B中的状态为空

我们就是这样 -

   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的一个问题是它基于更新。但在这里我必须做选择。

如何在sql中写这个。这是我的问题。

请有人帮帮我。

1 个答案:

答案 0 :(得分: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;