2014-05-10 218 views
0

我怎样才能组此数据表:Oracle查询分组依据不能工作,因为我想

username module_id 
testdavid M0003 
testdavid M0001 
testdavid M0004 
testdavid M0002 

username module_id 
testdavid M0003 
      M0001 
      M0004 
      M0002 

我使用这个查询,但仍显示testdavid第4行是。 这里是我的查询:

SELECT USERNAME, MODULE_ID FROM SEIAPPS_T_ACCESS_MODULE WHERE USERNAME = 'testdavid' GROUP BY USERNAME, MODULE_ID; 

请帮忙解决这个问题。谢谢

+0

这应该在表示层来完成,而不是在SQL。大多数报告和UI层都有简单的机制来抑制重复值。 SQL没有这样简单的机制。 –

回答

1

我不得不同意,这应该在您的演示逻辑中处理。然而,这里是使用LAG()一种方法:

select 
    case 
    when lag(username,1) over (order by username) is null then username 
    end username, 
    module_id 
from yourtable 
where username = 'testdavid' 
1

正常情况下,您想要在应用程序层执行此类工作。结果集不符合与SQL表和结果集关联的“表”布局。

然而,这是可能的:

SELECT (CASE WHEN ROW_NUMBER() OVER (PARTITION BY USERNAME ORDER BY MODULE_ID) = 1 THEN USERNAME 
     END) as USERNAME, MODULE_ID 
FROM SEIAPPS_T_ACCESS_MODUL 
WHERE USERNAME = 'testdavid' 
GROUP BY USERNAME, MODULE_ID 
ORDER BY USERNAME, MODULE_ID; 

在实践中,如果你只是想获得一个用户名关联的模块列表,为什么不把他们都在一行?

select username, listagg(module_id, ',') within group (order by module_id) 
from (select username, module_id 
     from SEIAPPS_T_ACCESS_MODUL 
     where username = 'testdavid' 
     group by username, module_id 
    ) um 
group by username;