我处于一种我不知道去哪里的情况。我必须编写一个查询,使其具有层次结构。
我将用一个例子来解释你 -
表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中写这个。这是我的问题。
请有人帮帮我。
答案 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;
现在,让我们说第一个表中有更多列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;