首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我应该如何加入才能实现这一目标?

我应该如何加入才能实现这一目标?
EN

Stack Overflow用户
提问于 2016-06-10 05:52:55
回答 1查看 79关注 0票数 3

我现在的处境是我不知道该去哪里。我必须编写一个查询,使其具有某种层次结构。

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

表A

这里有3列像这样的

代码语言:javascript
复制
  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列像这样的

代码语言:javascript
复制
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

现在我们必须把这两张表按层次连接起来,就像-

如果这两个国家匹配,则它们的州匹配和城市匹配比分配给它们的数量更多

如果两个国家匹配,它们的状态匹配,而它们的City不匹配(或者在另一个表中它是空的),那么我们必须从表B中分配这个数字,其中连接这两个表的城市将为null,而其他两个列匹配

--它就像一个层次结构--我们首先要达到最低的等级,如果这和它的好,如果不是上升到一个层次,就像这样。

如果只有这两个国家匹配,我们就必须指定另外两个列为null的数字。

我对上述两项的产出是这样的-

代码语言:javascript
复制
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

现在我有办法做到这一点,也就是,

首先,我把他们两个都加入进去,然后目标栏就会被填满,就像-

代码语言:javascript
复制
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中为空。

这会给我这个-

代码语言:javascript
复制
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中,state为null

我们就像这样-

代码语言:javascript
复制
   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编写它。这是我的问题。

有人能帮我一下吗。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-10 06:12:24

可以在不同的标准上轻松地使用几个LEFT JOINS

代码语言:javascript
复制
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 (我猜这就是您想要的):

代码语言:javascript
复制
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;
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37740798

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档