如何在FoxPro9中关联两张表?含无公共字段及指定字段匹配场景咨询
我来帮你解决FoxPro 9里的表关联问题,分两种情况给你详细说明:
一、按规则关联两张表(cFtyCD = cParaCD前3位)
从你给的数据来看,Table1.cParaCD的前3位正好对应Table2.cFtyCD(比如VTMC对应VTM、SFCC对应SFC),这里有两种常用的关联方法:
方法1:SQL JOIN(推荐用于查询)
用SQL的JOIN语句可以直接生成关联后的结果集,非常直观:
SELECT Table1.nParaID, Table1.cParaYear, Table1.cParaCD, Table1.cParaNo, Table2.cFtyCD, Table2.cInvNo, Table2.cCm_Sgl_TaxInv FROM Table1 INNER JOIN Table2 ON Table2.cFtyCD = LEFT(Table1.cParaCD, 3) INTO CURSOR ResultCursor && 将结果存入临时游标 BROWSE && 浏览结果
- 使用
INNER JOIN只会返回两张表中匹配的记录;如果想保留Table1的所有记录(即使Table2中没有对应数据),把INNER JOIN改成LEFT JOIN即可。
方法2:SET RELATION(适合数据工作期内的动态关联)
如果需要在打开表后动态关联,方便后续操作,可以用SET RELATION:
-- 先打开两张表 USE Table1 IN 0 USE Table2 IN 0 -- 给Table2建立基于cFtyCD的索引(SET RELATION需要关联字段有索引) SELECT Table2 INDEX ON cFtyCD TAG FtyCD -- 切换到Table1的工作区,设置关联规则 SELECT Table1 SET RELATION TO LEFT(cParaCD, 3) INTO Table2 -- 查看关联后的结果 LIST nParaID, cParaCD, Table2.cInvNo
执行后,操作Table1的记录时,Table2会自动定位到对应的匹配记录。
二、无公共字段时的表关联方法
如果两张表没有可以直接匹配的字段,根据业务需求可以用以下几种方式:
1. 按记录位置关联(RECNO()匹配)
直接按两张表的记录顺序一一对应(第1条对应第1条,第2条对应第2条):
USE Table1 IN 0 USE Table2 IN 0 SELECT Table1 SET RELATION TO RECNO() INTO Table2 -- 查看关联结果 LIST nParaID, Table2.cInvNo
注意:如果两张表记录数不一致,记录数多的表中超出的部分会关联到空数据。
2. 通过中间映射表关联
如果有自定义的对应规则(比如手动指定哪些记录对应哪些),可以创建一个中间映射表来实现关联:
-- 创建临时映射表,存储两张表的对应关系 CREATE CURSOR Mapping (cParaCD C(4), cFtyCD C(3)) INSERT INTO Mapping VALUES ("VTMC", "VTM") INSERT INTO Mapping VALUES ("SFCC", "SFC") INSERT INTO Mapping VALUES ("GMLC", "GML") -- 通过中间表关联两张原表 SELECT T1.*, T2.* FROM Table1 T1 INNER JOIN Mapping M ON T1.cParaCD = M.cParaCD INNER JOIN Table2 T2 ON M.cFtyCD = T2.cFtyCD INTO CURSOR ResultCursor BROWSE
这种方法适合关联规则复杂、没有直接表达式可以匹配的场景。
3. 交叉连接(笛卡尔积)
如果需要生成两张表所有记录的组合(每个Table1记录对应所有Table2记录),可以用交叉连接:
SELECT T1.nParaID, T2.cInvNo FROM Table1 T1, Table2 T2 && 逗号分隔表示交叉连接 INTO CURSOR CrossResult BROWSE
这种场景比较少见,一般用于生成所有可能的组合数据。
内容的提问来源于stack exchange,提问作者Niki_S
相关产品推荐
相关产品推荐

