我不知道它的正式名称是什么,所以也许这就是我在网上找不到任何东西的原因。基本上,当您在 vfp 中使用 sql 时,它会在不移动记录光标或保存结果的情况下进行初始传递(有时是 2?)。不幸的是,我的 sql 中有子例程,这些子例程在初始阶段运行和更改。
为什么我在 sql 查询中使用子例程?因为 vfp 不支持在选择项中引用子查询之外的内容(我再一次不知道正式名称)。
例子:select id, (select detail.name from detail where master.id == detail.id) name from master
这确实有效:select id, getname(id) from master
wheregetname()
是一个包含第一个示例中的 sql 的子例程。
您也可以使用联接,但以上只是一个示例,在我的情况下联接不起作用。
有没有办法处理初始通过?vfp 会创建一个布尔值之类的firstpass
东西吗?我想我可以在我的子程序中添加一个计数,但这似乎比现在更混乱。
或者,有人可以解释或链接我对 vfp 初始通行证的解释吗?我相信它之前只做一次初始传递,但现在它在更改一些代码后做了两次。
编辑:好的,我错了。上面的例子确实有效。以下内容不起作用:
SELECT d2.id, (SELECT TOP 1 d1.lname l FROM dpadd d1 WHERE d1.id== d2.id ORDER BY l) FROM dpadd d2
它给了我一个“SQL:不支持这种类型的查询”错误。
奇怪的是,如果我执行以下操作,它会起作用:
SELECT d2.id, (SELECT COUNT(d1.lname) FROM dpadd d1 WHERE d1.id == d2.id) FROM dpadd d2
关于子程序,它们是我的形式的方法。数据库是本地 .dbf 文件。我没有与任何服务器交互,只是运行带有into cursor
子句的直接 sql 命令,然后生成报告(通常)。
我会在几分钟后发回一个“不支持”的实际有用的选择语句。我相信你已经注意到这个top 1
例子完全没用。