注册 登录
编程论坛 VFP论坛

请教一下多表合并的问题。

redrum0618 发布于 2021-03-06 20:35, 2125 次点击
只有本站会员才能查看附件,请 登录

如图,我有3个表A,B,C
想要合成一个表D,表D的编号和型号是从A表来的,因为是全的,数据1是从B表来的,数据2是从C表来的,数据1和数据2不一定全,如果没有A表对应型号的数据,那最后D表中就设为0。

我是用的笨办法,先建好表D,再把A表数据insert进去,再根据B,C表的数据通过编号来更新,这样感觉有点慢,有老师有更好更快的方法吗?
14 回复
#2
redrum06182021-03-06 20:37
最好是用一条SQL命令一步搞定,那样就好了。
#3
schtg2021-03-07 06:38
回复 2楼 redrum0618
一般思路,没有数据测试,先A表 与 B表 左连接成 AA,A表 与 C表左连接成 BB,再AA 与 BB 成 结果。
只是完成一句SQL,但不是最快的哈,仅供参考,应该还有更简单的,一时没有想到哈,哈哈^_^
从给出的数据看,B表、C表中的编号应该是字符型的吧。
程序代码:
select AA.编号,AA.型号,AA.数据1,BB.数据2 ;
       from ;
       (select A表.编号,A表.型号,B表.数据1 from A表 Left Join B表 ON alltrim(A表.编号)==alltrim(B表.编号)) AA ;
       Left Join ;
       (select A表.编号,A表.型号,C表.数据2 from A表 Left Join C表 ON alltrim(A表.编号)==alltrim(C表.编号)) BB ;
       ON alltrim(AA.编号)==alltrim(BB.编号)


[此贴子已经被作者于2021-3-7 06:43编辑过]

#4
redrum06182021-03-07 08:07
回复 3楼 schtg
谢谢,等下我试试,现在功能是有了,就是数据多的时候速度有点慢,因为要更新两次,所以几千条数据都要七八分钟。
#5
sdta2021-03-07 09:00
index + set relation
#6
redrum06182021-03-07 09:07
回复 5楼 sdta
老师能不能就这A,B,C三张表的字段写个示范,我刚学不久还不会写你这个。
#7
sdta2021-03-07 09:10
如果真是新手, 不建议开始就学SQL命令的相关内容。如果数据不保密,上传相关表
#8
redrum06182021-03-07 09:31
回复 7楼 sdta
只有本站会员才能查看附件,请 登录

数据结构就是这样子的,示例里是表AA,表BB,表CC,最后合并成DD表。
#9
sdta2021-03-07 09:54
程序代码:
* VFP9 代码
CREATE CURSOR t1 (编号 c(10), 型号 c(22))
INSERT INTO t1 VALUES ("01", "a")
INSERT INTO t1 VALUES ("02", "b")
INSERT INTO t1 VALUES ("03", "c")
INSERT INTO t1 VALUES ("04", "d")

CREATE CURSOR t2 (编号 c(10), 数据1 n(10))
INSERT INTO t2 VALUES ("02", 2)
INSERT INTO t2 VALUES ("04", 4)

CREATE CURSOR t3 (编号 c(10), 数据2 n(10))
INSERT INTO t3 VALUES ("01", 1)
INSERT INTO t3 VALUES ("03", 3)
INSERT INTO t3 VALUES ("04", 4)

CREATE CURSOR t4 (编号 c(10), 型号 c(22), 数据1 n(10), 数据2 n(10))
INSERT INTO t4 (编号, 型号) SELECT 编号, 型号 FROM t1
INDEX on 编号 TAG bh
lc = "t2,t3"
ALINES(la, lc, ",")
FOR lnj = 1 TO ALEN(la, 1)
    SELECT (la[lnj])
    SET RELATION TO 编号 INTO t4
    SCAN
        REPLACE ("数据" + STR(lnj, 1)) WITH EVALUATE(la[lnj] + ".数据" + STR(lnj, 1)) IN t4
    ENDSCAN
ENDFOR
SELECT t4
SET ORDER TO
BROWSE
#10
redrum06182021-03-07 10:21
谢谢,消化一下。
#11
sdta2021-03-07 10:24
以下是引用redrum0618在2021-3-7 10:21:23的发言:

谢谢,消化一下。

先学会两个表关联,帮助文件中有示例的,自己找找看看
#12
redrum06182021-03-07 10:33
回复 11楼 sdta
对,不建立关联的话,用update加where的方式更新有点慢。
#13
sdta2021-03-07 10:35
以下是引用redrum0618在2021-3-7 10:33:49的发言:

对,不建立关联的话,用update加where的方式更新有点慢。

数据越多,速度越慢
#14
吹水佬2021-03-07 12:10
只有本站会员才能查看附件,请 登录

程序代码:
USE dd IN 0
ZAP
APPEND FROM aa FIELDS 编号,型号
SELECT 0
USE bb
INDEX on 编号 TAG b编号
SELECT 0
USE cc
INDEX on 编号 TAG c编号
SELECT dd
SET RELATION TO 编号 INTO bb, 编号 INTO cc
REPLACE ALL 数据1 WITH bb.数据1, 数据2 WITH cc.数据2
SELECT * FROM dd

#15
redrum06182021-03-07 22:28
回复 14楼 吹水佬
哈哈,根据你的思路我已经改好了,原来要8分钟,现在只要几秒钟
1