返回狼盟编程首页
编程搜索 [狼盟旧档]
论坛统计


请输入搜索关键字:
├─◆ 狼盟首页 > 查看贴子 > 详细信息

楼主

表的查询追加问题?


我的两个表如下:



表1:   学号  姓名  数学   语文         表2:   学号  姓名  数学   语文  英语

       001    李    88                        001    李    88     87    86

       002    刘           67                 002    刘    68

       003    王    48     47                 004    钱    28     27



表3:   学号  姓名  数学   语文  英语           

       001    李    88     87    86                

       002    刘    68     67                  

       003    王    48     47

       004    钱    28     27  



    我的问题是如何将表2中那些与表1不同的内容添加到表1中(而两表相同的内容不变) 成为表3的形式. (回复时能不能尽量将代码程序注释以下!!)

    请高手帮助不胜感激!!!!





colcolcom [ 1 楼 ]
2005-08-31 23:47:00
用do while好用还不会出错,还可以进行数据转换
SELECT *;
FROM 表二;
WHERE 学号="000"; **不可能有的一个ID值,生成一个空的临时表
INTO CURSOR 表三 readwrite
select 表二
go top
do while not eof()
  select 表一
  go top
  loca for 学号=表二.学号
  if found()
     a=iif(数学=表二.数学,数学,表二.数学)
     b=iif(语文=表二.语文,语文,表二.语文)
     c=表二.英语
     else
     a=表二.数学
     b=表二.语文
     c=表二.英语
  endif
  select 表三
  append blank
  repl 数学 with a,语言 with b,英语 with c
  select
  select 表二
  skip
endo
select 表二
go top
do while not eof()
  select 表一
  go top
  loca for 学号=表二.学号
  if found()
     a=iif(数学=表二.数学,数学,表二.数学)
     b=iif(语文=表二.语文,语文,表二.语文)
     c=表二.英语
     else
     a=表二.数学
     b=表二.语文
     c=表二.英语
  endif
  select 表三
  append blank
  repl 数学 with a,语言 with b,英语 with c
  select
  select 表二
  skip
endo
select 表二
go top
do while not eof()
  select 表一
  go top
  loca for 学号=表二.学号
  if found()
     a=iif(数学=表二.数学,数学,表二.数学)
     b=iif(语文=表二.语文,语文,表二.语文)
     c=表二.英语
     else
     a=表二.数学
     b=表二.语文
     c=表二.英语
  endif
  select 表三
  append blank
  repl 数学 with a,语言 with b,英语 with c
  select
  select 表二
  skip
endo
select 表一
go top
do while not eof()
  select 表二
  go top
  loca for 学号=表一.学号
  if not found()
     a=数学
     b=语文
     c=英语
  endif
  select 表三
  append blank
  repl 数学 with a,语言 with b,英语 with c
  select
  select 表一
  skip
endo

这方法很好用就是慢了点,不过如果数据类型不相同的时候相当好用 

colcolcom [ 2 楼 ]
2005-08-31 23:51:00
不好意思发错了


SELECT *;
FROM 表二;
WHERE 学号="000"; **不可能有的一个ID值,生成一个空的临时表
INTO CURSOR 表三 readwrite


select 表二
go top
do while not eof()
  select 表一
  go top
  loca for 学号=表二.学号
  if found()
     a=iif(数学=表二.数学,数学,表二.数学)
     b=iif(语文=表二.语文,语文,表二.语文)
     c=表二.英语
     else
     a=表二.数学
     b=表二.语文
     c=表二.英语
  endif
  select 表三
  append blank
  repl 数学 with a,语言 with b,英语 with c
  select
  select 表二
  skip
endo

select 表一
go top
do while not eof()
  select 表二
  go top
  loca for 学号=表一.学号
  if not found()
     a=数学
     b=语文
     c=英语
  endif
  select 表三
  append blank
  repl 数学 with a,语言 with b,英语 with c
  select
  select 表一
  skip
endo

这方法很好用就是慢了点,不过如果数据类型不相同的时候相当好用.要转换类型的话在转换a,b,c 的类型再向表三添加就是了,但要注意此时表三是临时表,要在最后加上导出指令将其保存才能存盘.
 

labxj0769 [ 3 楼 ]
2005-09-01 00:14:00
select * from 表1 into table  表3 &&生成新表==表1
select 表2
scan  &&遍历表2
cCno=alltrim( 学号) &&取当前学号,只当唯一没重复
scatter to arrsec  &&将当前记录加入数组arrsec
select* from 表3  where alltrim(学号)==cCno into array arrmain
if _TALLY=0 &&在表3中没有相同记录
    select 表3
    insert into 表3 from array arrsec
else  &&在表3中有相同记录
   for i=1 to alen(arrmain)  &&循环比较记录是否相同
    if vartype(arrmain[i])="N" &&为数字型
      if arrmain[i]#arrsec[i] and arrsec[i]>0 &&主为70,副为40,结果变成40
         arrmain[i]=arrsec[i]  &&进行数据转换
      endif
    endif
   endfor
   select 表3
   REPLACE FROM ARRAY arrmain all for alltrim(学号)==cCno &&按学号用改变后
   的数组替换
endif
endscan
 

gwmh6691 [ 4 楼 ]
2005-09-01 07:57:00
最简单的办法是使用查询向导,然后对语句的熟悉。 

tsfdg [ 5 楼 ]
2005-09-01 11:23:00
我按照“天涯”的方法去做了可结果只是将表2追加到表1中了,其中还包括重复记录 

labxj0769 [ 6 楼 ]
2005-09-01 12:21:00
我上面的没看到表2多个字段,其它没问题,你将以下复制到一个PRG程序,执行查结果:
*****按你的意思创建表1
CREATE TABLE 表1 FREE ( 学号 c(10),姓名 c(10),数学 int, 语文 int)
INSERT INTO 表1 values("001","李",88,0)
INSERT INTO 表1 values("002","刘",0,67)
INSERT INTO 表1 values("003","王",48,47)
********按你的意思创建表2
CREATE TABLE 表2 FREE ( 学号 c(10),姓名 c(10),数学 int, 语文 int,英语 int)
INSERT INTO 表2 values("001","李",88,87,86)
INSERT INTO 表2 values("002","刘",68,0,0)
INSERT INTO 表2 values("004","钱",28,27,0)


select * from 表1  into table  表3 &&生成新表==表1

ALTER table 表3 ADD COLUMN 英语 int &&此处增加英语字段,以下没变
select 表2
scan  &&遍历表2
cCno=alltrim( 学号) &&取当前学号,只当唯一没重复
scatter to arrsec  &&将当前记录加入数组arrsec
select* from 表3  where alltrim(学号)==cCno into array arrmain
if _TALLY=0 &&在表3中没有相同记录
    select 表3
    insert into 表3 from array arrsec
else  &&在表3中有相同记录
   for i=1 to alen(arrmain)  &&循环比较记录是否相同
    if vartype(arrmain[i])="N" &&为数字型
      if arrmain[i]#arrsec[i] and arrsec[i]>0 &&主为70,副为40,结果变成40
         arrmain[i]=arrsec[i]  &&进行数据转换
      endif
    endif
   endfor
   select 表3
   REPLACE FROM ARRAY arrmain all for alltrim(学号)==cCno &&按学号用改变后的数组替换
endif
endscan
SELECT 表3
BROWSE 

tsfdg [ 7 楼 ]
2005-09-03 19:53:00
还是不太好用!请再赐教!!! 

colcolcom [ 8 楼 ]
2005-09-05 00:38:00
SELECT *;
FROM 表二;
WHERE 学号="000"; **不可能有的一个ID值,生成一个空的临时表
INTO CURSOR 表三 readwrite


select 表二
go top
do while not eof()
  select 表一
  go top
  loca for 学号=表二.学号
  if found()
     a=iif(数学=表二.数学,数学,表二.数学)
     b=iif(语文=表二.语文,语文,表二.语文)
     c=表二.英语
     else
     a=表二.数学
     b=表二.语文
     c=表二.英语
  endif
  select 表三
  append blank
  repl 数学 with a,语言 with b,英语 with c
  select
  select 表二
  skip
endo

select 表一
go top
do while not eof()
  select 表二
  go top
  loca for 学号=表一.学号
  if not found()
     a=数学
     b=语文
     c=英语
  endif
  select 表三
  append blank
  repl 数学 with a,语言 with b,英语 with c
  select
  select 表一
  skip
endo
用我呢方法,其缺点是浪费一点点cup的资源,不过呢决对好用,转为它用到的方法和命令是最基本的,不会出错,好理解,