从树视图的相同 table 获取结果集
Get result set from the same table for tree view
我正在尝试通过从以下 table 获取数据来实现树视图,以下所有 ID 都是 varchars:
user_id name R_id R_name mgr_id mgr_name
----------------------------------------------
61 a 64 c 65 b
62 a 66 c 65 b
63 b 64 c 65 b
64 c 65 b 65 b
65 b NULL NULL NULL NULL
66 c 65 b 65 b
R_id、mgr_id依次是同一个table用户的列
现在我想得到以下结果集:
user_id name Parent
----------------------------
65 b NULL
66 c 65
64 c 65
63 b 64
62 a 66
61 a 64
这是我正在使用的查询,但它看起来有点复杂,我相信应该有更简单的方法来处理这个问题:
CREATE TABLE #DT
(
user_id VARCHAR(10),
name VARCHAR(100),
parent VARCHAR(10)
)
INSERT INTO #DT
SELECT DISTINCT
mgr_id as user_id,
mgr_name as name ,
NULL AS parent
FROM
Users
INSERT INTO #DT
SELECT DISTINCT
user_id as user_id,
name as name ,
mgr_id AS parent
FROM
Users
INSERT INTO #DT
SELECT DISTINCT
mgr_id as user_id,
mgr_name as name ,
R_id AS parent
FROM
Users
SELECT * FROM #DT
为此使用 UNION。默认情况下,UNION 实际上已经应用了 SELECT DISTINCT。您还只需要在第一个 SELECT 语句中应用列别名。
SELECT mgr_id AS user_id, mgr_name AS name, NULL AS parent FROM Users
UNION
SELECT user_id, name, mgr_id FROM Users
UNION
SELECT mgr_id, mgr_name, R_id FROM Users
您的原始查询带回了重复项,因为 DISTINCT
仅应用于每个查询,而不应用于整体结果。如果这对您很重要,您可以使用 (DEMO)
SELECT v.user_id,
v.name,
v.parent
FROM users
CROSS apply (VALUES (1,mgr_id,mgr_name,NULL),
(2,user_id,name,mgr_id),
(3,mgr_id,mgr_name, R_id) ) v(source, user_id, name, parent)
GROUP BY v.source,
v.user_id,
v.name,
v.parent
否则删除这些的更简单版本是
SELECT DISTINCT v.user_id,
v.name,
v.parent
FROM users
CROSS apply (VALUES (mgr_id,mgr_name,NULL),
(user_id,name,mgr_id),
(mgr_id,mgr_name, R_id) ) v(user_id, name, parent)
我正在尝试通过从以下 table 获取数据来实现树视图,以下所有 ID 都是 varchars:
user_id name R_id R_name mgr_id mgr_name
----------------------------------------------
61 a 64 c 65 b
62 a 66 c 65 b
63 b 64 c 65 b
64 c 65 b 65 b
65 b NULL NULL NULL NULL
66 c 65 b 65 b
R_id、mgr_id依次是同一个table用户的列 现在我想得到以下结果集:
user_id name Parent
----------------------------
65 b NULL
66 c 65
64 c 65
63 b 64
62 a 66
61 a 64
这是我正在使用的查询,但它看起来有点复杂,我相信应该有更简单的方法来处理这个问题:
CREATE TABLE #DT
(
user_id VARCHAR(10),
name VARCHAR(100),
parent VARCHAR(10)
)
INSERT INTO #DT
SELECT DISTINCT
mgr_id as user_id,
mgr_name as name ,
NULL AS parent
FROM
Users
INSERT INTO #DT
SELECT DISTINCT
user_id as user_id,
name as name ,
mgr_id AS parent
FROM
Users
INSERT INTO #DT
SELECT DISTINCT
mgr_id as user_id,
mgr_name as name ,
R_id AS parent
FROM
Users
SELECT * FROM #DT
为此使用 UNION。默认情况下,UNION 实际上已经应用了 SELECT DISTINCT。您还只需要在第一个 SELECT 语句中应用列别名。
SELECT mgr_id AS user_id, mgr_name AS name, NULL AS parent FROM Users
UNION
SELECT user_id, name, mgr_id FROM Users
UNION
SELECT mgr_id, mgr_name, R_id FROM Users
您的原始查询带回了重复项,因为 DISTINCT
仅应用于每个查询,而不应用于整体结果。如果这对您很重要,您可以使用 (DEMO)
SELECT v.user_id,
v.name,
v.parent
FROM users
CROSS apply (VALUES (1,mgr_id,mgr_name,NULL),
(2,user_id,name,mgr_id),
(3,mgr_id,mgr_name, R_id) ) v(source, user_id, name, parent)
GROUP BY v.source,
v.user_id,
v.name,
v.parent
否则删除这些的更简单版本是
SELECT DISTINCT v.user_id,
v.name,
v.parent
FROM users
CROSS apply (VALUES (mgr_id,mgr_name,NULL),
(user_id,name,mgr_id),
(mgr_id,mgr_name, R_id) ) v(user_id, name, parent)