首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 【着急,在线等】java数据库查询问题 [已结贴,结贴人:ggmmqq]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-21 11:55:57 楼主
    to:java2000_net
    对版规不熟,还请见谅,请版主劳累将原先那个帖子删除。。
    http://topic.csdn.net/u/20080421/08/ec93cd7b-5adf-4a1d-9dd9-ce1f1935922b.html?seed=1844985185&t=ffaebga3


    问题:表Auditer中有两个字段:UserName和name,它们之间的关系是UserName(1) <-------->(n)name
    如下表所示:
    UserName      Name
    -----------------------
    alex          linda
    alex          jessy
    aaron        messy
    alex          fiona
    tracy        alex
    aaron        howard
             
    要求将表中字段UserName值相同的记录合并为一条记录,其中该记录的Name字段按照当前的顺序用逗号隔开。如

    UserName        Name
    -------------------------------
    alex            linda,jessy,fiona
    aaron          messy,howard
    tracy          alex

    不知道是否可用sql实现,如不能,用java语言怎么实现?
    100  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-21 12:01:411楼 得分:20
    sql不知道怎么整,用java很简单。
    先select distinct UserName from Auditer 得到一个list
    再根据得到的每个username去查询,再得到一个list,把这个拼起来就行了。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • yami251139
    • 等级:
    发表于:2008-04-21 12:20:302楼 得分:0
    這么復雜的問題。。。明顯應該去sql板塊問么。。。
    ==========================================
    sql寫不來。。。好復雜啊
    用java的話,可以用hashtable來把大概。。。
    然后做個循環,把相同key的value放到第一個key的value后面,同時移除那條記錄
    放的時候前面+個,
    應該就行了,一個2次循環吧
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-21 12:23:073楼 得分:0
    引用 1 楼 kingssq 的回复:
    sql不知道怎么整,用java很简单。
    先select distinct UserName from Auditer 得到一个list
    再根据得到的每个username去查询,再得到一个list,把这个拼起来就行了。

    支持...............
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-21 12:44:284楼 得分:0
    引用 1 楼 kingssq 的回复:
    sql不知道怎么整,用java很简单。
    先select distinct UserName from Auditer 得到一个list
    再根据得到的每个username去查询,再得到一个list,把这个拼起来就行了。

    是个不错的方法,我先试试!
    谢谢!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-21 12:48:445楼 得分:5
    mysql
    select group_concat(name) from Auditer group by UserName;
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-21 13:01:406楼 得分:0
    引用 5 楼 hx2044 的回复:
    mysql
    select group_concat(name) from Auditer group by UserName;

    那请问oracle中如何写sql呢?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-21 13:11:137楼 得分:60
    引用 1 楼 kingssq 的回复:
    sql不知道怎么整,用java很简单。
    先select distinct UserName from Auditer 得到一个list
    再根据得到的每个username去查询,再得到一个list,把这个拼起来就行了。


    这样的话效率很低,你要去查两次数据库,
    你可以这样
    全部查询出来得到一个ResultSet rs
    Map <String,String> userMap;
    while(rs.next)
    {
        if(userMap.get(rs.getString(1))==null)
        {
              userMap.put(rs.getString(1),rs.getString(2));
          }else
        {
            String temp = userMap.get(rs.getString(1));
            userMap.put(rs.getString(1),temp+","+rs.getString(2));
        }
    }
    这样就可以了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-21 13:19:268楼 得分:0
    引用 6 楼 ggmmqq 的回复:
    引用 5 楼 hx2044 的回复:
    mysql 
    select group_concat(name) from Auditer group by UserName; 

    那请问oracle中如何写sql呢?



    我上网查了,没找到
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-21 13:24:169楼 得分:0
    写个存储过程,用临时表也可以
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-21 13:28:0210楼 得分:5
    SQL版这个问题很多:给你段代码 希望对你有帮助
    SQL code
    SQL> WITH A AS (SELECT 10 DEPTNO,'CLARK' ENAME FROM DUAL 2 UNION 3 SELECT 10 DEPTNO,'KING' ENAME FROM DUAL 4 UNION 5 SELECT 10 DEPTNO,'MILLER' ENAME FROM DUAL 6 UNION 7 SELECT 20 DEPTNO,'ADAMS' ENAME FROM DUAL 8 UNION 9 SELECT 20 DEPTNO,'FORD' ENAME FROM DUAL 10 UNION 11 SELECT 20 DEPTNO,'JONES' ENAME FROM DUAL 12 UNION 13 SELECT 20 DEPTNO,'SCOTT' ENAME FROM DUAL 14 UNION 15 SELECT 20 DEPTNO,'SMITH' ENAME FROM DUAL 16 UNION 17 SELECT 30 DEPTNO,'ALLEN' ENAME FROM DUAL 18 UNION 19 SELECT 30 DEPTNO,'BLAKE' ENAME FROM DUAL 20 UNION 21 SELECT 30 DEPTNO,'JAMES' ENAME FROM DUAL 22 UNION 23 SELECT 30 DEPTNO,'MARTIN' ENAME FROM DUAL 24 UNION 25 SELECT 30 DEPTNO,'WARD' ENAME FROM DUAL 26 ) 27 select DEPTNO,substr(MAX(SYS_CONNECT_BY_PATH(ENAME,',')),2) ENAME FROM 28 (SELECT DEPTNO,ENAME,ROW_NUMBER()OVER(PARTITION BY DEPTNO ORDER BY DEPTNO ) RN FROM A) 29 START WITH RN=1 30 CONNECT BY RN-1=PRIOR RN and deptno=prior deptno 31 GROUP BY DEPTNO 32 order by DEPTNO 33 / DEPTNO ENAME ---------- -------------------------------------------------------------------------------- 10 MILLER,KING,CLARK 20 JONES,FORD,ADAMS,SCOTT,SMITH 30 ALLEN,BLAKE,JAMES,MARTIN,WARD
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-21 13:32:5811楼 得分:0
    引用 7 楼 zhaoyutong 的回复:
    引用 1 楼 kingssq 的回复:
    sql不知道怎么整,用java很简单。 
    先select distinct UserName from Auditer 得到一个list 
    再根据得到的每个username去查询,再得到一个list,把这个拼起来就行了。


    这样的话效率很低,你要去查两次数据库,
    你可以这样
    全部查询出来得到一个ResultSet rs
    Map <String,String> userMap;
    while(rs.next)
    {
        if(userMap.get(rs.getString(1))==null)
        { 
          …

    高人,原先那个方法确实效率很低。。
    这样做确实不错……
    还有一个问题,如何将得到的userMap转换成List
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-21 13:38:1112楼 得分:0
    你要怎么转换,得到什么东西,Map 和List是两个接口,一个是key-value形势,一个是索引形式,直接转换肯定不行,你有什么业务需求
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-21 13:40:4813楼 得分:0
    引用 10 楼 memoordit 的回复:
    SQL版这个问题很多:给你段代码 希望对你有帮助
    SQL code
    SQL> WITH A AS (SELECT 10 DEPTNO,'CLARK' ENAME FROM DUAL
      2              UNION
      3              SELECT 10 DEPTNO,'KING' ENAME FROM DUAL
      4              UNION
      5              SELECT 10 DEPTNO,'MILLER' ENAME FROM DUAL
      6              UNION
      7              SELECT 20 DEPTNO,'ADAMS' ENAME FROM DUAL
      8              UNION
      9        …

    好晕啊!
    看不太懂,能帮我写一个我这个表的sql吗?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-21 13:45:5914楼 得分:0
    引用 12 楼 zhaoyutong 的回复:
    你要怎么转换,得到什么东西,Map 和List是两个接口,一个是key-value形势,一个是索引形式,直接转换肯定不行,你有什么业务需求

    首先感谢你的热心帮助!

    我就是想通过一定方法得出一个List:lstAuditer,这个List用于存放一个JavaBean集合:auditer
    auditerList这个JavaBean有两个String属性:UserName和name。
    所以我需要将得到的map的键和值分别对应UserName和name,set到javabean里面,然后添加到lstAuditer里。

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-21 14:06:3215楼 得分:10
                    Map <String,String> userMap = new HashMap <String,String>();
    List <Auditer> lstAuditer = new ArrayList <Auditer>();
    Set <Entry <String,String>> set = new HashSet <Entry <String,String>>();

    for(Map.Entry <String, String> entry :set)
    {
    Auditer auditer = new Auditer();
    auditer.setUserName(entry.getKey());
    auditer.setName(entry.getValue());
    lstAuditer.add(auditer);
    }

    Auditer 是你的javabean  Entry是Map。Entry,
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-21 14:24:5316楼 得分:0
    看上去楼上的提供的方法不错……学习了。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-21 14:34:2817楼 得分:0
    引用 7 楼 zhaoyutong 的回复:
    引用 1 楼 kingssq 的回复:
    sql不知道怎么整,用java很简单。 
    先select distinct UserName from Auditer 得到一个list 
    再根据得到的每个username去查询,再得到一个list,把这个拼起来就行了。


    这样的话效率很低,你要去查两次数据库,
    你可以这样
    全部查询出来得到一个ResultSet rs
    Map <String,String> userMap;
    while(rs.next)
    {
        if(userMap.get(rs.getString(1))==null)
        { 
          …


    1.对于表中数据不多的情况,一般是怎么方便怎么处理,谈性能没有必要。
    2.对于表中数据很多的情况,一般会考虑用分页技术每次查出一部分。像你那么说一次性全部取出来放到内存里,如果数据量很大的话,你去试试吧。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-21 14:56:5118楼 得分:0
    1.对于表中数据不多的情况,一般是怎么方便怎么处理,谈性能没有必要。
    2.对于表中数据很多的情况,一般会考虑用分页技术每次查出一部分。像你那么说一次性全部取出来放到内存里,如果数据量很大的话,你去试试吧。


    楼上息怒,我没有攻击你的意思,或许你说的有道理,楼主还不结贴吗
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-21 15:08:2019楼 得分:0
    引用 1 楼 kingssq 的回复:
    sql不知道怎么整,用java很简单。
    先select distinct UserName from Auditer 得到一个list
    再根据得到的每个username去查询,再得到一个list,把这个拼起来就行了。


    感觉一楼的方法好点,至少这样的代码看起来让人容易懂。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-21 15:29:0320楼 得分:0
    写一个过程应该可以实现的吧?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-21 15:39:5521楼 得分:0
    引用 18 楼 zhaoyutong 的回复:
    1.对于表中数据不多的情况,一般是怎么方便怎么处理,谈性能没有必要。 
    2.对于表中数据很多的情况,一般会考虑用分页技术每次查出一部分。像你那么说一次性全部取出来放到内存里,如果数据量很大的话,你去试试吧。 
     

    楼上息怒,我没有攻击你的意思,或许你说的有道理,楼主还不结贴吗

    结贴!

    谢谢各位的热心帮助!

    没有最好的方法,只有最适合的方法……

    再次谢谢各位。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-22 10:45:3222楼 得分:0
    m
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved