【问题标题】:How should I join to achieve this我应该如何加入才能实现这一目标
【发布时间】:2016-10-10 23:34:38
【问题描述】:

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

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

表 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

现在我们必须将这两个表连接到一个层次级别,例如 -

如果两个 Country 匹配,则它们的 state 匹配,并且 City 匹配比分配给它们的 Number 匹配

如果两个国家匹配,他们的州匹配并且他们的城市不匹配(或者它在另一个表中为空),那么我们必须从表 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

现在我也有办法实现这一点,即,

首先我将它们都加入内部,目标列将被填充为 -

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 中,并且 City 在表 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          
  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

这就是我最终想要的

现在这个方法的一个问题是它基于更新。但在这里我必须做选择。

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

请任何人都可以在这里帮助我。

【问题讨论】:

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


    【解决方案1】:

    在不同的条件下使用多个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;
    

    现在,假设您要更新的第一个表中有额外的列 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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-10
      • 2019-02-23
      • 1970-01-01
      • 2012-09-26
      • 2014-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多