我不知道它的官方名称是什么,所以也许这就是为什么我在网上找不到任何东西。 基本上,当你在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
其中getname()
是包含第一个示例中的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
示例完全没用。
答案 0 :(得分:0)
在预测中似乎不允许使用TOP。对于该示例,您可以改为:
SELECT d2.id, (SELECT MAX(d1.lname) l FROM dpadd d1 WHERE d1.id== d2.id) FROM dpadd d2
还有什么能给你带来麻烦?
玛