SQL查询在输出中重复名称

时间:2018-12-18 19:24:30

标签: java mysql sql iseries-navigator

我正在编写一个查询,该查询调用employee nameemployee's usernamesecurity levelmenumenu's tabsmenu descriptions。我希望查询仅将employee nameusername作为列显示一次,然后显示security levelmenumenu tabs和{{1 }}。

menu description

我会发布我的输出,但是它很大,所以我要总结一下我收到的信息。

Select usname as Name,
Ususer as Username,
Uswosecl as WO_SecurityLevel,
AoOpID as Operation_ID, aoseclevel as Operation_Security,
AoMenu as Menu, AoMenuItem as Tab, AoText as Description
from cudtatet.xxpuser
join fmsusrfua.xxpauops on uswosecl >= aoseclevel
and aoseclevel >= 0
where ususer NOT IN (‘*ALL’,’daffron’)
and aoAuOpID >=70000 and aoAuOpID < 80000
order by usname, ususer

我希望收到的输出是:

NAME        USERNAME      SEC LEVEL      MENU         TAB           DESC   
AIKO R.    ariggins       4              HELP        TIME ENTRY     MESSAGES
AIKO R.    ariggins       4              HELP        ABOUT          ABOUT
AKIO R.    ariggins       4              HELP        CHANGEPASS   CHANGEPASS
.......

我正在将该查询放入结果集中。如果可以通过查询完成,那就太好了。如果我需要在我的应用程序代码中执行此操作,则由于我不确定如何产生此输出,因此也会提供一些指导。

2 个答案:

答案 0 :(得分:0)

这类事情通常是在应用程序代码(java,php等)中完成的。

MySQL可以内部使用称为GROUP_CONCAT()的非标准聚合函数来完成此操作

尝试类似....(未调试)。

Select usname as Name, 
       Ususer as Username,
       Uswosecl as WO_SecurityLevel,
       AoOpID as Operation_ID, aoseclevel as Operation_Security,
       GROUP_CONCAT(CONCAT( AoMenu, '>' , AoMenuItem , '>', AoMenuItem )) menu
  from whatever
  join whatever ON ....
  where ...
  group by  usname  Ususer, Uswosecl, AoOpID, aoseclevel
  order by usname, ususer

根据每个用户有多少个不同的菜单详细信息,您可能想使用

 SET group_concat_max_len = 10000;

因此列表不会被截断。您可以使用任何合理的长度。如果您有数百个项目,则可能需要查看max-packet-length。

答案 1 :(得分:0)

我个人认为查询不是进行格式化的正确位置。取而代之的是,我需要查询返回列中的数据,然后在我的代码或报告软件中对其进行格式化。

但是,要回答您的问题,您可以合并用户列表以获取名称,然后对结果进行排序以使菜单散布着权限。 row_number用于隐藏第一项上的菜单。

注意:为了简化起见,我删除了一些字段,但是您可以将它们重新添加。

SELECT case when x.MenuName IS NULL THEN 'Name: ' + x.Name + ' UserName: ' + x.UserName'
ELSE case when rn=1 then 'Menu: ' else '     ' end + x.Menu END Output
FROM
(Select usname Name, Ususer UserName, NULL Menu, 0 rn
From  cudtatet.xxpuser
UNION
Select usname as Name,
Ususer as Username,
AoMenu as Menu,
Row_Number() Over (Partition BY usname Order BY AoMenu) rn
from cudtatet.xxpuser
join fmsusrfua.xxpauops on uswosecl >= aoseclevel
and aoseclevel >= 0
where ususer NOT IN (‘*ALL’,’daffron’)
and aoAuOpID >=70000 and aoAuOpID < 80000)
) x
ORDER BY x.Name, x.rn