我现在的处境是我不知道该去哪里。我必须编写一个查询,使其具有某种层次结构。
我会用一个例子来解释你-
表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现在我们必须把这两张表按层次连接起来,就像-
如果这两个国家匹配,则它们的州匹配和城市匹配比分配给它们的数量更多
如果两个国家匹配,它们的状态匹配,而它们的City不匹配(或者在另一个表中它是空的),那么我们必须从表B中分配这个数字,其中连接这两个表的城市将为null,而其他两个列匹配
--它就像一个层次结构--我们首先要达到最低的等级,如果这和它的好,如果不是上升到一个层次,就像这样。。
如果只有这两个国家匹配,我们就必须指定另外两个列为null的数字。
我对上述两项的产出是这样的-
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中,state为null
我们就像这样-
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编写它。这是我的问题。
有人能帮我一下吗。
发布于 2016-06-10 06:12:24
可以在不同的标准上轻松地使用几个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;https://stackoverflow.com/questions/37740798
复制相似问题