我有以下格式的数据。
表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
但我无法获得正确的订单,有更好的方法吗?
答案 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
<强> [更新] 强>
为什么你还需要那些意大利面条桌?你为什么不把一切都放在一两张桌子里?