| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 478 人关注过本帖
标题:请教VFP这样的 SQL代码会报错,如何改进
只看楼主 加入收藏
easyppt
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:332
专家分:797
注 册:2021-11-24
结帖率:100%
收藏
 问题点数:0 回复次数:8 
请教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个别名,只要有一个匹配,就算条件成立

搜索更多相关主题的帖子: SQL 编码 名称 报错 代码 
2025-02-14 14:14
laowan001
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:66
帖 子:1097
专家分:2698
注 册:2015-12-30
收藏
得分:0 
select tb1.* from tb1,tb2 where tb1.编码=tb2.编码 AND (tb1.名称=tb2.名称1 or tb1.名称=tb2.名称2 or tb1.名称=tb2.名称3)
试下这样行不行
2025-02-14 14:47
easyppt
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:332
专家分:797
注 册: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
csyx
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:火星
等 级:版主
威 望:37
帖 子:728
专家分:2927
注 册:2018-3-13
收藏
得分:0 
你一楼的语法符合 sql 标准,可惜, vfp9 不支持

这家伙很懒,啥也没留下
2025-02-14 15:16
easyppt
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:332
专家分:797
注 册: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
csyx
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:火星
等 级:版主
威 望:37
帖 子:728
专家分:2927
注 册:2018-3-13
收藏
得分:0 
2楼写法虽然能执行,但结果是错误的,随便弄几个测试数据试试就能看出来

create cursor tb1 (编码 c(10),名称 c(10), 数量 i)
create cursor tb2 (编码 c(10),名称1 c(10),名称2 c(10),名称3 c(10))

insert into tb1 values ('a001', 'aaa', 10)
insert into tb1 values ('a002', 'bbb', 20)
insert into tb1 values ('a003', 'bbb', 30)

insert into tb2 (编码,名称1) values ('a001', 'aaa')
insert into tb2 (编码,名称2) values ('a001', 'aaa')
insert into tb2 (编码,名称3) values ('a001', 'ccc')
insert into tb2 (编码,名称2) values ('a002', 'ddd')
insert into tb2 (编码,名称3) values ('a002', 'bbb')


这家伙很懒,啥也没留下
2025-02-14 15:19
csyx
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:火星
等 级:版主
威 望:37
帖 子:728
专家分:2927
注 册:2018-3-13
收藏
得分:0 
我也写一个很丑陋的 vfp 语法替代品吧
select * from tb1 where exists ( ;
    select * from ( ;
        select 编码, 名称1 as 名称 from tb2 ;
        union all ;
        select 编码, 名称2 as 名称 from tb2 ;
        union all ;
        select 编码, 名称3 as 名称 from tb2) t2 ;
    where tb1.编码 = t2.编码 and tb1.名称 = t2.名称 )

这家伙很懒,啥也没留下
2025-02-14 15:24
easyppt
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:332
专家分:797
注 册:2021-11-24
收藏
得分:0 
csyx 版主的也是一个思路,就是  3个字段合并到一个字段中 因为取的是 or,所以这样也是可以的。
不过,我5楼的代码,也可以通过。

谢谢 版主们的 分享!

2025-02-14 15:42
laowan001
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:66
帖 子:1097
专家分:2698
注 册:2015-12-30
收藏
得分:0 
不记得VFP是从哪个版本开始支持SQL,应该是很靠后的版本,但并不是对所有SQL的写法都支持
比较复杂的就不支持。
虽然比较弱,但好在基本的写法都能支持。
有了SQL的支持,感觉写VFP程序已经精简了许多,有时看着SQL语句就在想,这要是没有SQL,那得写多少行代码,而且效率还会较低
7 天前 09:53
快速回复:请教VFP这样的 SQL代码会报错,如何改进
数据加载中...
 
   



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

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