VFP中SELECT-SQL语句请教

sdta2012 2013-04-16 09:02:50
CREATE CURSOR T (机车型号 C(10),机车编号 C(10),设备名称 C(10),设备型号 C(10),设备编号 N(10),生产日期 D,生产厂家 C(10),标识 I)
INSERT INTO T VALUES ([SS4],[001A],[LLL主机],[2000],9049,{^2005-12-01},[株洲],1)
INSERT INTO T VALUES ([SS4],[001A],[LLL显示器1],[2000],10149,{^2007-02-01},[株洲],2)
INSERT INTO T VALUES ([SS4],[001A],[LLL显示器2],[2000],1234,{^2008-09-01},[株洲],3)
INSERT INTO T VALUES ([SS4],[001A],[TTT2箱],[2001],5985,{^2000-10-01},[思维],4)
INSERT INTO T VALUES ([SS4],[002A],[LLL主机],[2000],8076,{^2005-10-01},[株洲],1)
INSERT INTO T VALUES ([SS4],[002A],[LLL显示器1],[2000],10136,{^2007-02-01},[株洲],2)
INSERT INTO T VALUES ([SS4],[002A],[LLL显示器2],[2002],4567,{^2005-02-01},[株洲],3)
INSERT INTO T VALUES ([SS4],[002A],[TTT2箱],[2000],5902,{^2000-10-01},[思维],4)
SELECT DISTINCT 设备名称, 标识 FROM T ORDER BY 标识 INTO CURSOR T1
SCAN
SELECT * FROM T WHERE ALLTRIM(设备名称)==ALLTRIM(T1.设备名称) INTO CURSOR [S]+TRANSFORM(RECNO([T1]))
ENDSCAN
USE IN T1
SELECT S1.机车型号,S1.机车编号,S1.设备名称 设备名称,S1.设备型号 设备型号,S1.设备编号 设备编号,S1.生产日期 生产日期,S1.生产厂家 生产厂家,;
S2.设备名称 设备名称2,S2.设备型号 设备型号2,S2.设备编号 设备编号2,S2.生产日期 生产日期2,S2.生产厂家 生产厂家2,;
S3.设备名称 设备名称3,S3.设备型号 设备型号3,S3.设备编号 设备编号3,S3.生产日期 生产日期3,S3.生产厂家 生产厂家3,;
S4.设备名称 设备名称4,S4.设备型号 设备型号4,S4.设备编号 设备编号4,S4.生产日期 生产日期4,S4.生产厂家 生产厂家4 ;
FROM S1 INNER JOIN S2 ON S1.机车型号==S2.机车型号 AND S1.机车编号==S2.机车编号 ;
INNER JOIN S3 ON S1.机车型号==S3.机车型号 AND S1.机车编号==S3.机车编号 ;
INNER JOIN S4 ON S1.机车型号==S4.机车型号 AND S1.机车编号==S4.机车编号


如何用相对通用代码的方法,解决这一问题。如下例
CREATE CURSOR T (ID C(2),ZDM C(10),btz1 C(10),btz2 C(10)) &&保存不同记录的临时表
CREATE CURSOR TA (ID C(2),XM C(3),XB C(1))
CSTA=[01,A01,1;02,A02,1;03,A03,1;04,A04,2;05,A05,2;06,A06,2;07,A07,1;08,A08,1;09,A09,1;10,A10,2]
FOR I=1 TO ALINES(AA,CSTA,[;])
=ALINES(AAA,AA(I),[,])
INSERT INTO TA VALUES(AAA(1),AAA(2),AAA(3))
ENDFOR

CREATE CURSOR TB (ID C(2),XM C(3),XB C(1))
CSTB=[01,A11,1;02,A02,1;03,A03,2;04,A04,1;05,A05,2;06,A06,2;07,A07,1;08,A08,1;09,A09,1;10,A10,2]
FOR I=1 TO ALINES(BB,CSTB,[;])
=ALINES(BBB,BB(I),[,])
INSERT INTO TB VALUES(BBB(1),BBB(2),BBB(3))
ENDFOR

EE=AFIELDS(AA,'TA')
FOR I=1 TO EE
STORE "SELECT " TO ASQLA,ASQLB
IF UPPER(AA(I,1))<>'ID'
ASQLA=ASQLA+"'"+AA(I,1)+"' as zd,id,"+AA(I,1)+" FROM ta INTO CURSOR qta"
&ASQLA
ASQLB=ASQLB+"'"+AA(I,1)+"' as zd,id,"+AA(I,1)+" FROM tB INTO CURSOR qtB"
&ASQLB
ASQLC="INSERT INTO T SELECT a.ID,A.ZD,A."+AA(I,1)+",b."+AA(I,1)+" FROM qta a LEFT JOIN qtb b ON a.id=b.id WHERE A."+AA(I,1)+"<>B."+AA(I,1)
&ASQLC
ENDIF
NEXT

先谢谢了
...全文
351 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
sdta2012 2013-04-16
  • 打赏
  • 举报
回复
谢谢XUZHNING老师,9楼的代码最后达到了目的,但代码太多了,10楼的代码没有达到预期的目的,能否将9楼的代码再简练些。
xuzuning 2013-04-16
  • 打赏
  • 举报
回复
你实际只需要构造出链接串就可以了
CREATE CURSOR T (机车型号 C(10),机车编号 C(10),设备名称 C(10),设备型号 C(10),设备编号 N(10),生产日期 D,生产厂家 C(10),标识 I)
INSERT INTO T VALUES ([SS4],[001A],[LLL主机],[2000],9049,{^2005-12-01},[株洲],1)
INSERT INTO T VALUES ([SS4],[001A],[LLL显示器1],[2000],10149,{^2007-02-01},[株洲],2)
INSERT INTO T VALUES ([SS4],[001A],[LLL显示器2],[2000],1234,{^2008-09-01},[株洲],3)
INSERT INTO T VALUES ([SS4],[001A],[TTT2箱],[2001],5985,{^2000-10-01},[思维],4)
INSERT INTO T VALUES ([SS4],[002A],[LLL主机],[2000],8076,{^2005-10-01},[株洲],1)
INSERT INTO T VALUES ([SS4],[002A],[LLL显示器1],[2000],10136,{^2007-02-01},[株洲],2)
INSERT INTO T VALUES ([SS4],[002A],[LLL显示器2],[2002],4567,{^2005-02-01},[株洲],3)
INSERT INTO T VALUES ([SS4],[002A],[TTT2箱],[2000],5902,{^2000-10-01},[思维],4)

SELECT DISTINCT 设备名称, 标识 FROM T ORDER BY 标识 INTO CURSOR T1
s = ''
SCAN
   t = [S]+TRANSFORM(RECNO([T1]))
   SELECT * FROM T WHERE ALLTRIM(设备名称)==ALLTRIM(T1.设备名称) INTO CURSOR &t
   IF RECNO([T1]) > 1 then
   s = s + [ INNER JOIN &t ON S1.机车型号==&t..机车型号 AND S1.机车编号==&t..机车编号]
   endif
ENDSCAN
USE IN T1

SELECT * FROM S1 &s
wwwwb 2013-04-16
  • 打赏
  • 举报
回复
CREATE CURSOR T (机车型号 C(10),机车编号 C(10),设备名称 C(10),设备型号 C(10),设备编号 N(10),生产日期 D,生产厂家 C(10),标识 I)
INSERT INTO T VALUES ([SS4],[001A],[LLL主机],[2000],9049,{^2005-12-01},[株洲],1)
INSERT INTO T VALUES ([SS4],[001A],[LLL显示器1],[2000],10149,{^2007-02-01},[株洲],2)
INSERT INTO T VALUES ([SS4],[001A],[LLL显示器2],[2000],1234,{^2008-09-01},[株洲],3)
INSERT INTO T VALUES ([SS4],[001A],[TTT2箱],[2001],5985,{^2000-10-01},[思维],4)
INSERT INTO T VALUES ([SS4],[002A],[LLL主机],[2000],8076,{^2005-10-01},[株洲],1)
INSERT INTO T VALUES ([SS4],[002A],[LLL显示器1],[2000],10136,{^2007-02-01},[株洲],2)
INSERT INTO T VALUES ([SS4],[002A],[LLL显示器2],[2002],4567,{^2005-02-01},[株洲],3)
INSERT INTO T VALUES ([SS4],[002A],[TTT2箱],[2000],5902,{^2000-10-01},[思维],4)

EE=AFIELDS(AA,'T')
ASQLA="select "
FOR j=1 to 4
aa1=1
ff=IIF(j=1,1,3)
FOR I=ff TO EE
IF AA(I,1)<>'标识'
ASQLA=ASQLA+"s"+TRANSFORM(J)+'.'+AA(I,1)+" as "+AA(I,1)+IIF(j=1,' ,',TRANSFORM(j)+' ,')
ENDIF 
NEXT 
NEXT
asqla=LEFT(asqla,len(asqla)-1)+' FROM S1 '

SELECT DISTINCT 设备名称, 标识 FROM T ORDER BY 标识 INTO CURSOR T1

 CSTR=[]
 CSTR1=[]

 SCAN
    SELECT * FROM T WHERE ALLTRIM(设备名称)==ALLTRIM(T1.设备名称) INTO CURSOR [S]+TRANSFORM(RECNO([T1]))
    FOR I=3 TO FCOUNT()-1
        CSTR=CSTR+[SELECT ']+S1.机车型号+[' 机车型号,']+S1.机车编号+[' 机车编号,;] +CHR(13)+CHR(10)+[S]+TRANSFORM(RECNO([T1]))+[.]+FIELD(I)+[ ]+FIELD(I)+IIF(RECNO([T1])<RECCOUNT([T1]),IIF(I<FCOUNT()-1,[,],[,;]+CHR(13)+CHR(10)),[ ])
    ENDFOR
    IF RECNO([T1])>1
       CSTR1=CSTR1+CHR(13)+CHR(10)+[INNER JOIN ]+[S]+TRANSFORM(RECNO([T1]))+[ ON ]+[S1.机车型号==]+[S]+TRANSFORM(RECNO([T1]))+[.]+[机车型号]+[ AND ]+[S1.机车编号==]+[S]+TRANSFORM(RECNO([T1]))+[.]+[机车编号]+IIF(RECNO([T1])<RECCOUNT([T1]),[;]+CHR(13)+CHR(10),[])
    ENDIF
 ENDSCAN
 
 asqla=asqla+cstr1

 &asqla
lygcw9602 2013-04-16
  • 打赏
  • 举报
回复
SELECT DISTINCT 设备名称, 标识 FROM T ORDER BY 标识 INTO CURSOR T1 CSTR=[] CSTR1=[] SCAN SELECT * FROM T WHERE ALLTRIM(设备名称)==ALLTRIM(T1.设备名称) INTO CURSOR [S]+TRANSFORM(RECNO([T1])) FOR I=3 TO FCOUNT()-1 CSTR=CSTR+[SELECT ']+S1.机车型号+[' 机车型号,']+S1.机车编号+[' 机车编号,;] +CHR(13)+CHR(10)+[S]+TRANSFORM(RECNO([T1]))+[.]+FIELD(I)+[ ]+FIELD(I)+IIF(RECNO([T1])<RECCOUNT([T1]),IIF(I<FCOUNT()-1,[,],[,;]+CHR(13)+CHR(10)),[ ]) ENDFOR IF RECNO([T1])>1 CSTR1=CSTR1+CHR(13)+CHR(10)+[INNER JOIN ]+[S]+TRANSFORM(RECNO([T1]))+[ ON ]+[S1.机车型号==]+[S]+TRANSFORM(RECNO([T1]))+[.]+[机车型号]+[ AND ]+[S1.机车编号==]+[S]+TRANSFORM(RECNO([T1]))+[.]+[机车编号]+IIF(RECNO([T1])<RECCOUNT([T1]),[;]+CHR(13)+CHR(10),[]) ENDIF ENDSCAN
wwwwb 2013-04-16
  • 打赏
  • 举报
回复
引用 6 楼 lygcw9602 的回复:
我的代码在执行过程中出现错误信息:不能识别的短语及关键字 关键是转换问题。
你把代码显示出来看看
lygcw9602 2013-04-16
  • 打赏
  • 举报
回复
我的代码在执行过程中出现错误信息:不能识别的短语及关键字 关键是转换问题。
wwwwb 2013-04-16
  • 打赏
  • 举报
回复
现在手头没有 环境,看了看,除了第1个表要机车型号,机车编号外,其它字段都是一样的,判断一下就可以了,有什么问题
lygcw9602 2013-04-16
  • 打赏
  • 举报
回复
引用 2 楼 wwwwb 的回复:
第2段代码是我的吧,思路是一样的,先取得字段名,变量从1-4循环字符串累加生成SQ语句
能否请WWWWB老师,帮忙写一个,搞了一天都没搞出来。
lygcw9602 2013-04-16
  • 打赏
  • 举报
回复
引用 1 楼 apple_8180 的回复:
你还是帖原记录和想要的结果记录吧。
豆老师:我贴的代码就是原记录和想要的结果,就是想把代码改为WWWWB老师的代码,不知如何改
wwwwb 2013-04-16
  • 打赏
  • 举报
回复
第2段代码是我的吧,思路是一样的,先取得字段名,变量从1-4循环字符串累加生成SQ语句
十豆三 2013-04-16
  • 打赏
  • 举报
回复
你还是帖原记录和想要的结果记录吧。
sdta2012 2013-04-16
  • 打赏
  • 举报
回复
谢谢各位老师了
WWWWA 2013-04-16
  • 打赏
  • 举报
回复
基本没有精简的了
CREATE CURSOR T (机车型号 C(10),机车编号 C(10),设备名称 C(10),设备型号 C

(10),设备编号 N(10),生产日期 D,生产厂家 C(10),标识 I)
INSERT INTO T VALUES ([SS4],[001A],[LLL主机],[2000],9049,{^2005-12-01},[

株洲],1)
INSERT INTO T VALUES ([SS4],[001A],[LLL显示器1],[2000],10149,{^2007-02-

01},[株洲],2)
INSERT INTO T VALUES ([SS4],[001A],[LLL显示器2],[2000],1234,{^2008-09-

01},[株洲],3)
INSERT INTO T VALUES ([SS4],[001A],[TTT2箱],[2001],5985,{^2000-10-01},[思

维],4)
INSERT INTO T VALUES ([SS4],[002A],[LLL主机],[2000],8076,{^2005-10-01},[

株洲],1)
INSERT INTO T VALUES ([SS4],[002A],[LLL显示器1],[2000],10136,{^2007-02-

01},[株洲],2)
INSERT INTO T VALUES ([SS4],[002A],[LLL显示器2],[2002],4567,{^2005-02-

01},[株洲],3)
INSERT INTO T VALUES ([SS4],[002A],[TTT2箱],[2000],5902,{^2000-10-01},[思

维],4)

EE=AFIELDS(AA,'T')
ASQLA="select "
SELECT MAX(标识) from t into array aa2
aa1=aa2(1)
FOR j=1 to aa1
ff=IIF(j=1,1,aa1-1)
FOR I=ff TO EE
ASQLA=ASQLA+IIF(AA(I,1)<>'标识',"s"+TRANSFORM(J)+'.'+AA(I,1)+" as "+AA

(I,1)+IIF(j=1,' ,',TRANSFORM(j)+' ,'),"")
NEXT
NEXT
asqla=LEFT(asqla,len(asqla)-1)+' FROM S1 '
SELECT DISTINCT 设备名称, 标识 FROM T ORDER BY 标识 INTO CURSOR T1
CSTR1=[]
SCAN
SELECT * FROM T WHERE ALLTRIM(设备名称)==ALLTRIM(T1.设备名称) INTO

CURSOR [S]+TRANSFORM(RECNO([T1]))
IF RECNO([T1])>1
CSTR1=CSTR1+CHR(13)+CHR(10)+[INNER JOIN ]+[S]+TRANSFORM(RECNO

([T1]))+[ ON ]+[S1.机车型号==]+[S]+TRANSFORM(RECNO([T1]))+[.]+[机车型号]+[

AND ]+[S1.机车编号==]+[S]+TRANSFORM(RECNO([T1]))+[.]+[机车编号]+IIF(RECNO

([T1])<RECCOUNT([T1]),[;]+CHR(13)+CHR(10),[])
ENDIF
ENDSCAN
asqla=asqla+cstr1
&asqla

2,749

社区成员

发帖
与我相关
我的任务
社区描述
VFP,是Microsoft公司推出的数据库开发软件,用它来开发数据库,既简单又方便。
社区管理员
  • VFP社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧