乱世中的 SQL,是 Not In 还是 Not Exists。
要说起 VFP 特点大伙都可以提出很多很多,我个人认为排名第一的应该是 VFP SQL。很多人不知道,SQL 其实也是一门语言,它的书足足有你两个手指头这么厚。不同数据库略有差异这里不做介绍,而 VFP 妙就妙在,它把 SQL 与 VFP 指令结合在一起了,这使得 VFP 就是那么的鹤立鸡群傲视群雄。可惜这是一个悲伤的故事,导致很多 Foxer 根本没有意识到其实 SQL 也是要学习的,SQL 三大语句一个也没学会就匆匆忙忙用 VFP 开发程序了,碰到不会的就直接改用 VFP 指令去解决。最终的结果是,在所有开发语言中,Foxer 的 SQL 掌握能力是最弱的群体,优势变劣势。
说来惭愧,我以前也是用过 DBC 的也是用过 F/S 结构的,只是当年并不知道这是什么意思,大家都这么说我也就这么做,也一直无比得瑟的在 vfp 中写着各种 SQL,心里暗爽不就这么回事。vfp9 出来后 SYS(3099 [, 70 | 80 | 90]) 直接给了我当头一棒,当时就困惑无比:我到底学了啥 SQL????痛定思痛决定跟真正的 SQL 来个正面交锋,一年以后我的整个世界观就都变了,一年前问题还是那个问题,一年后我解决同一个问题的方式己经不是那一回事了。
不希望有人读得懂我在说什么,我也只是随便说说。
说回 Not In 还是 Not Exists,不管你怎么百度得到的结果都是 Not Exists,一代一代的经验就是这么传承下来。可大人们,现在都是 3202 年了,SQL 97 早己退出历史舞台了,它们并没有任何区别。
程序代码:
Create Table T1 (c1 VarChar(10)) Insert Into T1 Values ('01') Insert Into T1 Values ('02') Insert Into T1 Values ('03') Insert Into T1 Values ('04') Insert Into T1 Values ('05') Create Table T2 (c1 VarChar(10)) Insert Into T2 Values ('01') Insert Into T2 Values ('03') Insert Into T2 Values ('05') Go Create NonClustered Index IX_t1 On dbo.t1 (C1) ON [PRIMARY] Create NonClustered Index IX_t2 On dbo.t2 (C1) ON [PRIMARY] Go Select * From T1 t1 Where t1.C1 Not In (Select t2.c1 From T2 t2) Select * From T1 t1 Where Not Exists(Select 1 From T2 t2 Where t2.c1 = t1.c1)
[此贴子已经被作者于2023-3-27 09:04编辑过]