Sql server 将多个结果集合并到一个表中
场景:我需要为权限矩阵准备一份excel表文档。应用程序中总共有15个角色和20个模块,使用用户定义的函数传递roleid和moduleid,我可以获得单个角色的权限详细信息,并可以复制和粘贴到excel工作表中 但接下来,我会重复同样的任务300次。为了减少工作量,我计划在模块中合并所有角色的权限。所以我只能做20次 我尝试的内容:我创建了一个UDF函数,用于将SP中以逗号分隔的结果拆分为列。还创建了20个变量,以表格式存储每个角色的权限详细信息Sql server 将多个结果集合并到一个表中,sql-server,sql-server-2012,Sql Server,Sql Server 2012,场景:我需要为权限矩阵准备一份excel表文档。应用程序中总共有15个角色和20个模块,使用用户定义的函数传递roleid和moduleid,我可以获得单个角色的权限详细信息,并可以复制和粘贴到excel工作表中 但接下来,我会重复同样的任务300次。为了减少工作量,我计划在模块中合并所有角色的权限。所以我只能做20次 我尝试的内容:我创建了一个UDF函数,用于将SP中以逗号分隔的结果拆分为列。还创建了20个变量,以表格式存储每个角色的权限详细信息 DECLARE @UDF_Function1
DECLARE @UDF_Function1 TABLE (Details VARCHAR (10));
INSERT INTO @UDF_Function1 (Details)
SELECT 'hidden' UNION ALL SELECT 'edit' UNION ALL SELECT 'edit';
DECLARE @UDF_Function2 TABLE (Details VARCHAR (10));
INSERT INTO @UDF_Function2 (Details)
SELECT 'view' UNION ALL SELECT 'edit' UNION ALL SELECT 'view';
-- SELECT * FROM @UDF_Function1;
-- SELECT * FROM @UDF_Function2;
SELECT F1.Details AS R1, F2.Details AS R2 FROM
(SELECT * FROM @UDF_Function1) F1,
(SELECT * FROM @UDF_Function2) F2;
<强>示例数据和表:考虑每个<代码> @ Udfl函数< /C>存储每个角色的权限细节,并希望以单个表格式显示所有结果。
DECLARE @UDF_Function1 TABLE (Details VARCHAR (10));
INSERT INTO @UDF_Function1 (Details)
SELECT 'hidden' UNION ALL SELECT 'edit' UNION ALL SELECT 'edit';
DECLARE @UDF_Function2 TABLE (Details VARCHAR (10));
INSERT INTO @UDF_Function2 (Details)
SELECT 'view' UNION ALL SELECT 'edit' UNION ALL SELECT 'view';
-- SELECT * FROM @UDF_Function1;
-- SELECT * FROM @UDF_Function2;
SELECT F1.Details AS R1, F2.Details AS R2 FROM
(SELECT * FROM @UDF_Function1) F1,
(SELECT * FROM @UDF_Function2) F2;
输出结果不是我期望的格式,我怎样才能达到下面期望的格式
预期结果:
| R1 | R2 |
|---------------------|
| hidden | view |
| edit | edit |
| edit | view |
我的是SQL Server 2012。试试这个
DECLARE @UDF_Function1 TABLE (id int identity,Details VARCHAR (10));
INSERT INTO @UDF_Function1 (Details)
SELECT 'hidden' UNION ALL SELECT 'edit' UNION ALL SELECT 'edit';
DECLARE @UDF_Function2 TABLE (id int identity,Details VARCHAR (10));
INSERT INTO @UDF_Function2 (Details)
SELECT 'view' UNION ALL SELECT 'edit' UNION ALL SELECT 'view';
SELECT F1.Details AS R1, F2.Details AS R2 FROM
(SELECT * FROM @UDF_Function1) F1,
(SELECT * FROM @UDF_Function2) F2 WHERE F1.id=F2.id;
在查询中,您需要在WHERE
子句中提供联接条件,我已经为其使用了自生成标识列id
。
在没有联接条件的情况下,两个表的行之间发生笛卡尔积,结果行数超过要求。试试这个
DECLARE @UDF_Function1 TABLE (id int identity,Details VARCHAR (10));
INSERT INTO @UDF_Function1 (Details)
SELECT 'hidden' UNION ALL SELECT 'edit' UNION ALL SELECT 'edit';
DECLARE @UDF_Function2 TABLE (id int identity,Details VARCHAR (10));
INSERT INTO @UDF_Function2 (Details)
SELECT 'view' UNION ALL SELECT 'edit' UNION ALL SELECT 'view';
SELECT F1.Details AS R1, F2.Details AS R2 FROM
(SELECT * FROM @UDF_Function1) F1,
(SELECT * FROM @UDF_Function2) F2 WHERE F1.id=F2.id;
在查询中,您需要在WHERE
子句中提供联接条件,我已经为其使用了自生成标识列id
。
在没有联接条件的情况下,两个表的行之间发生笛卡尔积,结果行数超过要求。添加标识列并进行简单联接
DECLARE @UDF_Function1 TABLE (id int identity,Details VARCHAR (10));
INSERT INTO @UDF_Function1 (Details)
SELECT 'hidden' UNION ALL SELECT 'edit' UNION ALL SELECT 'edit';
DECLARE @UDF_Function2 TABLE (id int identity,Details VARCHAR (10));
INSERT INTO @UDF_Function2 (Details)
SELECT 'view' UNION ALL SELECT 'edit' UNION ALL SELECT 'view';
SELECT F1.Details AS R1, F2.Details AS R2
FROM @UDF_Function1 f1 inner join @UDF_Function2 f2 on f1.id=f2.id
添加标识列并执行简单的联接
DECLARE @UDF_Function1 TABLE (id int identity,Details VARCHAR (10));
INSERT INTO @UDF_Function1 (Details)
SELECT 'hidden' UNION ALL SELECT 'edit' UNION ALL SELECT 'edit';
DECLARE @UDF_Function2 TABLE (id int identity,Details VARCHAR (10));
INSERT INTO @UDF_Function2 (Details)
SELECT 'view' UNION ALL SELECT 'edit' UNION ALL SELECT 'view';
SELECT F1.Details AS R1, F2.Details AS R2
FROM @UDF_Function1 f1 inner join @UDF_Function2 f2 on f1.id=f2.id
您可以使用cte yoo,如下所示:
with
UDF_Function1 (id, Details) as (
select 1, 'hidden'
union all
select 2, 'edit'
union all
select 3, 'edit'
),
UDF_Function2 (id, Details) as (
select 1, 'view'
union all
select 2, 'edit'
union all
select 3, 'view'
)
SELECT F1.Details AS R1, F2.Details AS R2
FROM UDF_Function1 f1 inner join UDF_Function2 f2 on f1.id=f2.id
您可以使用cte yoo,如下所示:
with
UDF_Function1 (id, Details) as (
select 1, 'hidden'
union all
select 2, 'edit'
union all
select 3, 'edit'
),
UDF_Function2 (id, Details) as (
select 1, 'view'
union all
select 2, 'edit'
union all
select 3, 'view'
)
SELECT F1.Details AS R1, F2.Details AS R2
FROM UDF_Function1 f1 inner join UDF_Function2 f2 on f1.id=f2.id
返回我的预期结果,谢谢。返回我的预期结果,谢谢。