先看下代码:
CREATE TEMPORARY TABLE `tbl_temp_morenum` (
            `common.ucHostNum` char(16) NOT NULL default '',
            `common.ucNumber1` char(16) NOT NULL default '',
            `common.ucNumber2` char(16) NOT NULL default '',
            `common.ucNumber3` char(16) NOT NULL default '',
            `common.ucNumber4` char(16) NOT NULL default '',
            `common.ucNumber5` char(16) NOT NULL default '',
            `common.ucNumber6` char(16) NOT NULL default '',
            `common.ucNumber7` char(16) NOT NULL default '',
            `common.ucNumber8` char(16) NOT NULL default ''
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into tbl_temp_morenum
            select DISTINCT U.ucNumber, I.ucNumber, I.ucNumber, I.ucNumber, I.ucNumber, I.ucNumber,
                I.ucNumber, I.ucNumber, I.ucNumber
            from tbl_UserData as U
            Join tbl_UserIndex as I on I.ulUsn = U.ulUSN
            where U.ucNumber <> I.ucNumber and I.ulUsn = U.ulUSN;
我希望看到的结果:将tbl_UserIndex里面所有ulUsn字段值相同的记录的ucNumber字段插入到tbl_temp_morenum临时表里面(当然,tbl_UserIndex中ulUsn相同的记录最多只有9条),组成一条记录。
实际输出的结果:插入了8条记录(希望是一条),8条记录中common.ucHostNum相同,同一条记录中的common.ucNumber1到common.ucNumber8是相同的。
请问该怎么样才能是想想要的结果?

解决方案 »

  1.   

     (不要高估你的汉语表达能力或者我的汉语理解能力)
       建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。
       参考一下这个贴子的提问方式http://topic.csdn.net/u/20091130/20/8343ee6a-417c-4c2d-9415-fa46604a00cf.html
       
       1. 你的 create table xxx .. 语句
       2. 你的 insert into xxx ... 语句
       3. 结果是什么样,(并给以简单的算法描述)
       4. 你用的数据库名称和版本(经常有人在MS SQL server版问 MySQL)
       
       这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。   
      

  2.   

    insert into tbl_temp_morenum
      select DISTINCT U.ucNumber,DISTINCT  I.ucNumber,DISTINCT  I.ucNumber,DISTINCT  I.ucNumber,DISTINCT  I.ucNumber,DISTINCT  I.ucNumber,DISTINCT 
      I.ucNumber, DISTINCT I.ucNumber,DISTINCT  I.ucNumber
      from tbl_UserData as U
      Join tbl_UserIndex as I on I.ulUsn = U.ulUSN
      where U.ucNumber <> I.ucNumber and I.ulUsn = U.ulUSN;试试看。另外请给出你的测试数据。
      

  3.   

    2楼的我试了下,报个语法错误,下面我把问题说详细点:这个是一个查询的存储过程
    create procedure sp_morenum_query(
        IN  p_taskID                    INT,
        OUT p_iRet                      INT,
        IN  p_ucHostNum                 varchar(16)
       ),
    再看下面的零时表格代码:
    CREATE TEMPORARY TABLE `tbl_temp_morenum` (
      `common.ucHostNum` char(16) NOT NULL default '',
      `common.ucNumber1` char(16) NOT NULL default '',
      `common.ucNumber2` char(16) NOT NULL default '',
      `common.ucNumber3` char(16) NOT NULL default '',
      `common.ucNumber4` char(16) NOT NULL default '',
      `common.ucNumber5` char(16) NOT NULL default '',
      `common.ucNumber6` char(16) NOT NULL default '',
      `common.ucNumber7` char(16) NOT NULL default '',
      `common.ucNumber8` char(16) NOT NULL default ''
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    insert into tbl_temp_morenum
      select DISTINCT U.ucNumber, I.ucNumber, I.ucNumber, I.ucNumber, I.ucNumber, I.ucNumber,
      I.ucNumber, I.ucNumber, I.ucNumber
      from tbl_UserData as U
      Join tbl_UserIndex as I on I.ulUsn = U.ulUSN
      where U.ucNumber <> I.ucNumber and I.ulUsn = U.ulUSN;
    其中common.ucHostNum、common.ucNumber1到common.ucNumber8时EXCEL里定义的公用参数,这9个数据都存在于tbl_UserIndex,其对应字段为ucNumber(插入数据的时候,把9个号码分次插入tbl_UserIndex的ucNumber字段,其ulUsn字段一样),9个数据在tbl_UserIndex里都有相同的ulUsn字段,其值相同;
    我希望看到的结果:将tbl_UserIndex里面所有ulUsn字段值相同的记录的ucNumber字段插入到tbl_temp_morenum临时表里面(当然,tbl_UserIndex中ulUsn相同的记录最多只有9条),组成一条记录。
    实际输出的结果:插入了8条记录(希望是一条),8条记录中common.ucHostNum相同,同一条记录中的common.ucNumber1到common.ucNumber8是相同的。
    测试数据:输入了9个数据:
    15884504480 23654 23655 23656 23657 23658 23659 23660 23661
    将这9个数据存入tbl_UserIndex时赋予相同的ulUsn(最多只有这9条记录的ulUsn值相同),
    我希望看到的结果:
    主号码         号码1 号码2 号码3  号码4  号码5 号码6 号码7 号码8
    15884504480 23654 23655 23656 23657 23658 23659 23660 23661实际测出的结果:
    主号码 号码1 号码2 号码3 号码4 号码5 号码6 号码7 号码8 
    15884504480 23654 23654 23654 23654 23654 23654 23654 23654 
    15884504480 23655 23655 23655 23655 23655 23655 23655 23655 
    15884504480 23656 23656 23656 23656 23656 23656 23656 23656 
    15884504480 23657 23657 23657 23657 23657 23657 23657 23657 
    15884504480 23658 23658 23658 23658 23658 23658 23658 23658 
    15884504480 23659 23659 23659 23659 23659 23659 23659 23659 
    15884504480 23660 23660 23660 23660 23660 23660 23660 23660 
    15884504480 23661 23661 23661 23661 23661 23661 23661 23661 
    上面我的插入数据写得有问题,请问如何做才能有我想要的结果??
    我希望看到的结果:
    主号码         号码1 号码2 号码3  号码4  号码5 号码6 号码7 号码8
    15884504480 23654 23655 23656 23657 23658 23659 23660 23661
      

  4.   

    相关表的建表、插入记录的SQL语句、正确结果贴出来
      

  5.   

    表格是EXCEL里面创建的,tbl_UserIndex表格主要字段{…,ucNumber,ulUsn,…},所有数据都保存在tbl_UserIndex表格。
    下面是将数据插入tbl_UserIndex的代码:
            if(p_ucNumber1 is NULL or p_ucNumber1 = "") then
              SET p_iRet = 88046;
              SET l_cNmsRet1  = '输入参数不能为空';
              SET l_cNmsRet2  = '号码1';
              leave label_main;
            else
              call sp_get_rowno_and_rowid('tbl_UserIndex',l_iRowNo,l_iRowID);
              insert into tbl_UserIndex(ucDnSet,usCentrexGrp,ucNumber,usModuleNo,ulUsn,iRowID,iRowNo,iRowState)
                          values(l_ucDnSet,l_CentrexGrp,p_ucNumber1,l_ModuleNo,l_ulUSN,l_iRowID,l_iRowNo,l_iRowState);
            end if;
            if(p_ucNumber2 is not NULL and p_ucNumber2 <> "") then
              call sp_get_rowno_and_rowid('tbl_UserIndex',l_iRowNo,l_iRowID);
              insert into tbl_UserIndex(ucDnSet,usCentrexGrp,ucNumber,usModuleNo,ulUsn,iRowID,iRowNo,iRowState)
                          values(l_ucDnSet,l_CentrexGrp,p_ucNumber2,l_ModuleNo,l_ulUSN,l_iRowID,l_iRowNo,l_iRowState);
            end if;
            if(p_ucNumber3 is not NULL and p_ucNumber3 <> "") then
              call sp_get_rowno_and_rowid('tbl_UserIndex',l_iRowNo,l_iRowID);
              insert into tbl_UserIndex(ucDnSet,usCentrexGrp,ucNumber,usModuleNo,ulUsn,iRowID,iRowNo,iRowState)
                          values(l_ucDnSet,l_CentrexGrp,p_ucNumber3,l_ModuleNo,l_ulUSN,l_iRowID,l_iRowNo,l_iRowState);
            end if;
            if(p_ucNumber4 is not NULL and p_ucNumber4 <> "") then
              call sp_get_rowno_and_rowid('tbl_UserIndex',l_iRowNo,l_iRowID);
              insert into tbl_UserIndex(ucDnSet,usCentrexGrp,ucNumber,usModuleNo,ulUsn,iRowID,iRowNo,iRowState)
                          values(l_ucDnSet,l_CentrexGrp,p_ucNumber4,l_ModuleNo,l_ulUSN,l_iRowID,l_iRowNo,l_iRowState);
            end if;
            if(p_ucNumber5 is not NULL and p_ucNumber5 <> "") then
              call sp_get_rowno_and_rowid('tbl_UserIndex',l_iRowNo,l_iRowID);
              insert into tbl_UserIndex(ucDnSet,usCentrexGrp,ucNumber,usModuleNo,ulUsn,iRowID,iRowNo,iRowState)
                          values(l_ucDnSet,l_CentrexGrp,p_ucNumber5,l_ModuleNo,l_ulUSN,l_iRowID,l_iRowNo,l_iRowState);
            end if;
            if(p_ucNumber6 is not NULL and p_ucNumber6 <> "") then
              call sp_get_rowno_and_rowid('tbl_UserIndex',l_iRowNo,l_iRowID);
              insert into tbl_UserIndex(ucDnSet,usCentrexGrp,ucNumber,usModuleNo,ulUsn,iRowID,iRowNo,iRowState)
                          values(l_ucDnSet,l_CentrexGrp,p_ucNumber6,l_ModuleNo,l_ulUSN,l_iRowID,l_iRowNo,l_iRowState);
            end if;
            if(p_ucNumber7 is not NULL and p_ucNumber7 <> "") then
              call sp_get_rowno_and_rowid('tbl_UserIndex',l_iRowNo,l_iRowID);
              insert into tbl_UserIndex(ucDnSet,usCentrexGrp,ucNumber,usModuleNo,ulUsn,iRowID,iRowNo,iRowState)
                          values(l_ucDnSet,l_CentrexGrp,p_ucNumber7,l_ModuleNo,l_ulUSN,l_iRowID,l_iRowNo,l_iRowState);
            end if;
            if(p_ucNumber8 is not NULL and p_ucNumber8 <> "") then
              call sp_get_rowno_and_rowid('tbl_UserIndex',l_iRowNo,l_iRowID);
              insert into tbl_UserIndex(ucDnSet,usCentrexGrp,ucNumber,usModuleNo,ulUsn,iRowID,iRowNo,iRowState)
                          values(l_ucDnSet,l_CentrexGrp,p_ucNumber8,l_ModuleNo,l_ulUSN,l_iRowID,l_iRowNo,l_iRowState);
            end if;
    所有参数均是合法的,插入的数据: 
      号码1 号码2 号码3 号码4 号码5 号码6 号码7 号码8
     23654 23655 23656 23657 23658 23659 23660 23661
    插入后tbl_UserIndex里面有9条ulUsn相同的记录,还有一个是号码为15884504480的,
    在tbl_UserIndex记录如下:
    {…15882504480,0,…}
    {…23654,0,…}
    {…23655,0,…}
    {…23656,0,…}
    {…23657,0,…}
    {…23658,0,…}
    {…23659,0,…}
    {…23660,0,…}
    {…23661,0,…}用3楼的插入数据的方法得到的结果:
    主号码         号码1 号码2 号码3 号码4 号码5 号码6 号码7 号码8  
    15884504480 23654 23654 23654 23654 23654 23654 23654 23654  
    15884504480 23655 23655 23655 23655 23655 23655 23655 23655  
    15884504480 23656 23656 23656 23656 23656 23656 23656 23656  
    15884504480 23657 23657 23657 23657 23657 23657 23657 23657  
    15884504480 23658 23658 23658 23658 23658 23658 23658 23658  
    15884504480 23659 23659 23659 23659 23659 23659 23659 23659  
    15884504480 23660 23660 23660 23660 23660 23660 23660 23660  
    15884504480 23661 23661 23661 23661 23661 23661 23661 23661  
    我希望得到的结果:
    主号码        号码1  号码2 号码3 号码4 号码5 号码6 号码7 号码8
    15884504480 23654 23655 23656 23657 23658 23659 23660 23661
    在线等待中,多谢各位前来解答
      

  6.   

    有啊,ulUsn就是标志字段,这个是实现一机多号功能的,15884504480是主号码,其他的8个都是分号码,他们的ulUsn字段必须相同,并且与其他的数据的ulUsn不相同(也就是最多只有9条记录的ulUsn相同,查询的时候要求输入主号码:15884504480,根据主号码找到ulUsn),通过ulUsn把找到的号码插入到创建的临时表格中,临时表格如下:
    CREATE TEMPORARY TABLE `tbl_temp_morenum` (
      `common.ucHostNum` char(16) NOT NULL default '',
      `common.ucNumber1` char(16) NOT NULL default '',
      `common.ucNumber2` char(16) NOT NULL default '',
      `common.ucNumber3` char(16) NOT NULL default '',
      `common.ucNumber4` char(16) NOT NULL default '',
      `common.ucNumber5` char(16) NOT NULL default '',
      `common.ucNumber6` char(16) NOT NULL default '',
      `common.ucNumber7` char(16) NOT NULL default '',
      `common.ucNumber8` char(16) NOT NULL default ''
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    怎么样插入才能有想要的结果呢?谢谢答疑
      

  7.   

    ulUsn就是标志字段:内容是什么,就是交叉表
      

  8.   

    ulUsn最初是从tbl_UserData里面来的,tbl_UserData里面有字段{…ucNumber,ulUsn……},主号码是在tbl_UserData和tbl_UserIndex里面都有的,分号码只存在于tbl_UserIndex表,
      

  9.   

    在这里ulUsn值都是0,因为主号码在tbl_UserData里面是第一条记录
      

  10.   

    模拟的话只要tbl_UserIndex里的数据就可以了啊,我在3楼和5楼贴了数据的
    tbl_UserIndex{…ucNumber,ulUsn…}
    数据
    {…15882504480,0,…}
    {…23654,0,…}
    {…23655,0,…}
    {…23656,0,…}
    {…23657,0,…}
    {…23658,0,…}
    {…23659,0,…}
    {…23660,0,…}
    {…23661,0,…}
    我希望得到的结果:
    主号码       号码1   号码2 号码3 号码4 号码5 号码6 号码7 号码8
    15884504480 23654 23655 23656 23657 23658 23659 23660 23661
      

  11.   

    应该有1个字段区分主机、分机,分机号码增加序号字段(fid)
    比如
    23654 1
    23655 2
    select ucNumber,(select ucNumber from tbl_UserIndex where ulUsn=a.ulUsn and fid=1) as 号码1 ,
    (select ucNumber from tbl_UserIndex where ulUsn=a.ulUsn and fid=2) as 号码2 ,
    .....
    from tbl_UserIndex a where ucNumber='15882504480'
      

  12.   

    select distinct ucNumber,(select ucNumber from tbl_UserIndex where ulUsn=a.ulUsn and fid=1) as 号码1 ,
    (select ucNumber from tbl_UserIndex where ulUsn=a.ulUsn and fid=2) as 号码2 ,
    .....
    from tbl_UserIndex a where ucNumber='15882504480'
      

  13.   

    没有那个字段,只有表格自增的iRowID字段,实际上这9个号码是没有任何主次之分的,都是平级的
    iRowID字段是唯一的,但是ulUsn相同的记录的iRowID可能不连续,所以比较难搞,我是搞C的,现在公司BMS的存储过程没人写,就叫我写了。
      

  14.   

    那就要用SP了
    DECLARE CURSOR DD FOR 
    SELECT ucNumber,ulUsn FROM tbl_UserIndex WHERE ulUsn=(SELECT ulUsn FROM tbl_UserIndex
    WHERE ucNumber='15882504480')
    打开游标、循环、插入记录即可
      

  15.   

    现在问题就是用循环插入的时候,只能一个记录一个记录的插入,
    创建的临时表CREATE TEMPORARY TABLE `tbl_temp_morenum` (
      `common.ucHostNum` char(16) NOT NULL default '',
      `common.ucNumber1` char(16) NOT NULL default '',
      `common.ucNumber2` char(16) NOT NULL default '',
      `common.ucNumber3` char(16) NOT NULL default '',
      `common.ucNumber4` char(16) NOT NULL default '',
      `common.ucNumber5` char(16) NOT NULL default '',
      `common.ucNumber6` char(16) NOT NULL default '',
      `common.ucNumber7` char(16) NOT NULL default '',
      `common.ucNumber8` char(16) NOT NULL default ''
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    插入一个字段common.ucHostNum的值后,怎么跳到下一个字段common.ucNumber1,