我正在尝试从 fox pro 数据库中提取大量数据,使用它并将其插入到 mysql 数据库中。一次做所有事情太多了,所以想分批做 10 000 条记录。Fox Pro SQL中的LIMIT 5、10等价于什么,想要一个select语句
从人数限制 5、10 中选择姓名、地址;
即从第 5 个开始,只返回 10 个结果。在网上环顾四周,他们只提到了 top 显然没有多大用处。
看一下RecNo()函数。
FoxPro 不直接支持 LIMIT 子句。它确实有“TOP nn”,但它只提供给定百分比内的“最顶级记录”,甚至限制返回 32k 条记录(最大)。
您最好将数据转储为 CSV,或者如果这不切实际(由于大小问题),则编写一个小的 FoxPro 脚本自动生成一系列 BEGIN-INSERT(x10000)-COMMIT 语句转储到一系列文本文件。当然,你需要一个 FoxPro 开发环境,所以这可能不适用于你的情况......
Visual FoxPro 不直接支持 LIMIT。我使用以下查询来克服限制:
SELECT TOP 100 * from PEOPLE WHERE RECNO() > 1000 ORDER BY ID;
其中 100 是限制,1000 是偏移量。
使用 TOP 子句很容易绕过 LIMIT 子句;如果您想从记录 _start 中提取以从名为 _test 的文件中记录 _finish,您可以执行以下操作:
[VFP]
** 假设 _start <= _finish,如果不是,则会出现顶部子句错误
*
_finish = MIN(RECCOUNT('_test'),_finish)
*
SELECT * FROM (SELECT TOP (_finish - _start + 1) * FROM (SELECT TOP _finish *, RECNO() AS _tempo FROM _test ORDER BY _tempo) xx ORDER BY _tempo DESC) yy ORDER BY _tempo
**
[/VFP]
几年前,我不得不将 Foxpro 数据库转换为 Mysql。我为解决这个问题所做的就是在 Foxpro 表中添加一个自动递增的 id 列,并将其用作行引用。
那么你可以做类似的事情。
select name, address from people where id >= 5 and id <= 10;
Foxpro sql 文档没有显示任何类似于限制的内容。
为了扩展 Eyvind 的答案,我将创建一个程序来使用 RecNo() 函数来提取给定范围内的记录,比如 10,000 条记录。
然后,您可以一次以编程方式循环遍历包含 10,000 条记录的大表,并将数据加载到 MySQL 数据库中。
通过使用 RecNO() 函数,您可以确定不会多次插入行,并且能够在数据加载过程中的已知点重新启动。如果您需要停止并重新启动加载过程,这本身就非常方便。
在这里,根据您的表格进行调整。花了我 2 分钟,我这样做太频繁了。
N1 - 按任何方式分组,并确保你有一个 max(id),你可以使用 recno() 来制作一个,正确排序
N2 - 加入 N1,其中 ID = N1 的 Max Id,显示 N2 中所需的字段
然后,如果您想加入其他表,请将它们全部放在括号中并给它一个别名并将其包含在连接中。
Select N1.reference, N1.OrderNoteCount, N2.notes_desc LastNote
FROM
(select reference, count(reference) OrderNoteCount, Max(notes_key) MaxNoteId
from custnote
where reference != ''
Group by reference
) N1
JOIN
(
select reference, count(reference) OrderNoteCount, notes_key, notes_desc
from custnote
where reference != ''
Group by reference, notes_key, notes_desc
) N2 ON N1.MaxNoteId = N2.notes_key
根据返回的行数,如果您使用的是 .NET Framework,您可以通过以下方式偏移/限制获取的 DataTable:
dataTable = dataTable.AsEnumerable().Skip(offset).Take(limit).CopyToDataTable();
请记住添加程序集 System.Data.DataSetExtensions。