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值。同样,这种表结构不利于维护和查询。编辑后的帖子现在可以正常工作了。非常感谢您的帮助和花费的时间。我知道这个表需要规范化并“拆分”成三个表,但这是我必须用这个表单做的事情。再次感谢您,祝您度过愉快的一天!