在SQL Server中创建层次结构

时间:2010-09-08 16:24:30

标签: sql sql-server sql-server-2005 tsql sql-server-2008

我有以下格式的数据。

表1

e_id   e_name  e_type 
-------------------------
1      CBC     2
2      ABC     3
3      N2      1
4      CBC1    3
5      ABC1    3
6      N1      1

表2

N_ID   N_Name
---------------
3      N2
6      N1

表3

N_ID  E_ID
------------
3     1
3     2
3     3
6     4
6     5
6     6

我想按如下方式构建一个层次结构。

e_id    e_name     e_type   n_id
------------------------------------
6       N1           1        6
4        - ABC1      3        6
5        - CBC1      3        6
3       N2           1        3
4        - ABC       3        3
5        - CBC       2        3

按节点排序(升序),子节点(升序)。

我尝试过类似的事情,

SELECT u.e_id, 
CASE WHEN e_TYPE_ID = 1 THEN  u.e_name ELSE ' - ' + u.e_name END e_name, 
e_TYPE_ID, su.n_ID  
FROM table1 u
INNER JOIN table3 su on u.e_id = su.e_id 
WHERE EXISTS (SELECT N_ID FROM table2 WHERE N_ID = CASE WHEN u.e_TYPE_ID = 1 THEN u.e_id ELSE n_ID END)
ORDER BY  e_TYPE_ID, u.e_name,n_id

但我无法获得正确的订单,有更好的方法吗?

3 个答案:

答案 0 :(得分:3)

使用:

WITH summary AS (
  SELECT a.e_id,
         a.e_name,
         a.e_type,
         b.n_id,
         CASE WHEN e_type = 1 THEN e_type ELSE 2 END AS rank
    FROM TABLE1 a
    JOIN TABLE3 b ON b.e_id = a.e_id)
   SELECT s.e_id,
          CASE 
            WHEN s.rank > 1 THEN ' - '+ s.e_name 
            ELSE s.e_name 
          END AS e_name,
          s.e_type,
          s.n_id
     FROM summary s
 ORDER BY s.n_id DESC, s.rank, s.e_name

我测试使用:

WITH table2 AS (
   SELECT 3 AS n_id, 'N2' AS n_name
   UNION ALL
   SELECT 6, 'N1'),
     table1 AS (
   SELECT 1 AS e_id, 'CBC' AS e_name, 2 AS e_type
   UNION ALL
   SELECT 2, 'ABC', 3
   UNION ALL
   SELECT 3, 'N2', 1
   UNION ALL
   SELECT 4, 'CBC1', 3
   UNION ALL
   SELECT 5, 'ABC1', 3
   UNION ALL
   SELECT 6, 'N1', 1),
     table3 AS (
   SELECT 3 AS n_id, 1 AS e_id
   UNION ALL
   SELECT 3, 2
   UNION ALL
   SELECT 3, 3
   UNION ALL
   SELECT 6, 4
   UNION ALL
   SELECT 6, 5
   UNION ALL
   SELECT 6, 6),
     summary AS (
   SELECT a.e_id,
          a.e_name,
          a.e_type,
          b.n_id,
          CASE WHEN e_type = 1 THEN e_type ELSE 2 END AS rank
     FROM TABLE1 a
     JOIN TABLE3 b ON b.e_id = a.e_id)
  SELECT s.e_id,
         CASE 
            WHEN s.rank > 1 THEN ' - '+ s.e_name 
            ELSE s.e_name 
         END AS e_name,
         s.e_type,
         s.n_id
    FROM summary s
ORDER BY s.n_id DESC, s.rank, s.e_name

答案 1 :(得分:1)

如果您使用的是SQL Server 2008(或2008 R2),我建议您使用 Model Your Data Hierarchies With SQL Server 2008 中显示的层次结构ID。

答案 2 :(得分:0)

我将为您设置正确的路径,您将需要一个CTE(公用表表达式)来完成此任务:

;with EH as 
(
select 1 level, * from Table1 t1 where e_type = 1
union all
select level+1, * from EH 
join Table3 t3 on eh.e_id = t3.e_id 
join Table3 t32 on t3.n_id = t32.n_id and t3.e_id

--FUUUUUUUUUUUUUUUUUUUUU!!!!!!!!!!!!!!1111

<强> [更新]

为什么你还需要那些意大利面条桌?你为什么不把一切都放在一两张桌子里?