| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
共有 678 人关注过本帖
标题:请教VFP这样的 SQL代码会报错,如何改进
取消只看楼主 加入收藏
easyppt
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:351
专家分:850
注 册:2021-11-24
结帖率:100%
收藏
 问题点数:0 回复次数:3 
请教VFP这样的 SQL代码会报错,如何改进
create curs tb1(编码 c(10),名称 c(10),数量 i)
create curs tb2(编码 c(10),名称1 c(10),名称2 c(10),名称3 c(10))

上面是表结构(测试,随意取的),在VFP中,执行下面的SQL代码,会报错:SQL: 关联字段时出错 (错误 1801)

select * from tb1 where exists(select * from tb2 where tb2.编码=tb1.编码 and   (tb2.名称1=tb1.名称 or tb2.名称2=tb1.名称 or tb2.名称3=tb1.名称)   )

SQL代码怎么改,我需要的就是 取tb1的记录,条件是 编码 和名称 必须 存在于表tb2中,只是 这个 名称,在tb2中有3个别名,只要有一个匹配,就算条件成立

2025-02-14 14:14
easyppt
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:351
专家分:850
注 册:2021-11-24
收藏
得分:0 
谢谢版主,这个代码可以的,你的代码其实就是下面这句:
select tb1.* from tb1 inner join tb2 on tb1.编码=tb2.编码 AND (tb1.名称=tb2.名称1 or tb1.名称=tb2.名称2 or tb1.名称=tb2.名称3)

我疑惑的是exists() 的用法,只加一个,比如:tb2.名称1=tb1.名称  不会报错,但 加上 or的 2个,就报错,这个  exists() 太弱了,搞不懂啥情况

在 MSSQL里 习惯性用 exists(),包括上面的写法在MSSQL里也是没问题的,VFP却不行

另外,修正一下,我要用: not exists(),即 取 不存在的

[此贴子已经被作者于2025-2-14 15:11编辑过]

2025-02-14 14:56
easyppt
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:351
专家分:850
注 册:2021-11-24
收藏
得分:0 
我也感觉应该是 VFP的SQL太弱了。 难道只能这样写吗:

select * from tb1 where tb1.编码 not in (;
select tb1.编码 from tb1 inner join tb2 on tb1.编码=tb2.编码 AND (tb1.名称=tb2.名称1 or tb1.名称=tb2.名称2 or tb1.名称=tb2.名称3))

感觉 不管是  in  还是 exists()  条件都不能太复杂,只要复杂就报错
2025-02-14 15:18
easyppt
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:351
专家分:850
注 册:2021-11-24
收藏
得分:0 
csyx 版主的也是一个思路,就是  3个字段合并到一个字段中 因为取的是 or,所以这样也是可以的。
不过,我5楼的代码,也可以通过。

谢谢 版主们的 分享!

2025-02-14 15:42
快速回复:请教VFP这样的 SQL代码会报错,如何改进
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016939 second(s), 11 queries.
Copyright©2004-2025, BC-CN.NET, All Rights Reserved