Sql server 返回分层数据的SQL选择查询
我有一张这样的桌子:Sql server 返回分层数据的SQL选择查询,sql-server,tsql,Sql Server,Tsql,我有一张这样的桌子: State_id | County_id| City_id | Name | Additional_Name ----------------------------------------------------------------- 1 | 0 | 0 | California | State 1 | 1 | 0 | Los Ange
State_id | County_id| City_id | Name | Additional_Name
-----------------------------------------------------------------
1 | 0 | 0 | California | State
1 | 1 | 0 | Los Angeles | County
1 | 1 | 1 | Los Angeles | City
1 | 2 | 0 | San Diego | County
1 | 2 | 1 | San Diego | City
2 | 0 | 0 | Texas | State
2 | 1 | 0 | Harris | County
2 | 1 | 1 | Houston | City
它持续了10000行。我试图完成的是构建一个SELECT语句,它将导致:
State | County | City
-------------------------------------------
California | Los Angeles | Los Angeles
California | San Diego | San Diego
Texas | Harris | Houston
正如你们所看到的,我想选择每个城市并显示它的州和县。state_id、country_id、city_id和additional_Name列应该是解决这个问题的关键,但我不知道如何使用它们 这将使用您当前的表结构获取您的数据:
SELECT t2.[Name] AS [State]
,t3.[Name] AS County
,t1.[Name] AS City
FROM MyTable t1
JOIN MyTable t2 -- get state
ON t2.State_id = t1.State_id
AND t2.County_id = 0
AND t2.City_id = 0
JOIN MyTable t3 -- get county
ON t3.County_id = t1.County_id
AND t3.State_id = t1.State_id
AND t3.City_id = 0
WHERE t1.City_id > 0 --(or use t1.Additional_Name = 'City'
但实际上: 您应该将数据库规范化为三个单独的表:
城市
状态
县
ID Name
1 California
2 Texas
县
ID Name
1 Los Angeles
2 San Diego
3 Harris
ID StateID CountyID Name
1 1 1 Los Angeles
2 1 2 San Diego
3 2 3 Houston
城市
ID Name
1 Los Angeles
2 San Diego
3 Harris
ID StateID CountyID Name
1 1 1 Los Angeles
2 1 2 San Diego
3 2 3 Houston
希望你能看到管理事情是多么容易。您可以选择将StateID
添加到country
表中,以进一步规范化。但我会尽量简短地回答
使用类似的查询从这些新表中选择相同的数据:
SELECT state.[Name] AS [State]
,county.[Name] AS County
,city.[Name] AS City
FROM MyCity city
JOIN MyState state ON state.ID = city.StateID -- get state
JOIN MyCounty county ON county.ID = city.CountyID -- get county
如果可能,将该信息分为三个表。这是一个设计糟糕的数据库,将来只会给你带来更多的麻烦。这属于“规范化”数据库的范畴。我查询了主题中显示的数据样本,得到了42条记录,而我应该得到3条(因为有3个城市)。州专栏里有各种各样的数据,比如洛杉矶、哈里斯、休斯顿等等。谢谢你们所有的标准化建议,我可能最终会找到它,但是现在桌子的形状必须保持原样。这次我得到了:“加利福尼亚洛杉矶洛杉矶”德克萨斯洛杉矶休斯顿加利福尼亚洛杉矶洛杉矶德克萨斯洛杉矶休斯顿加利福尼亚圣地亚哥圣地亚哥圣地亚哥加利福尼亚圣地亚哥哈里斯洛杉矶德克萨斯哈里斯休斯顿加利福尼亚休斯顿洛杉矶德克萨斯休斯顿“”/code'如果州不同,我看到您重用县的ID值。同样,这种表结构不利于维护和查询。编辑后的帖子现在可以正常工作了。非常感谢您的帮助和花费的时间。我知道这个表需要规范化并“拆分”成三个表,但这是我必须用这个表单做的事情。再次感谢您,祝您度过愉快的一天!