| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 749 人关注过本帖
标题:关于SELECT-SQL的问题
只看楼主 加入收藏
panpende
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:4
帖 子:528
专家分:963
注 册:2009-4-27
结帖率:90.91%
收藏
已结贴  问题点数:20 回复次数:9 
关于SELECT-SQL的问题
前二个帖子受到各位老师指教,受益匪浅,在此谢谢了。继续提一个问题,请老师们继续指导。
SET TALK OFF
SET SAFETY OFF
SET CENTURY ON
SET EXACT ON
SET DATE YMD
SET SYSMENU OFF
CLEAR ALL
CLOSE DATABASES
CREATE DBF L1 (A1 C(10), A2 C(10),A3 N(2)) &&建立表
FOR X=1 TO 8
Y=STR(X,1)
APPEND BLANK
REPLACE A1 WITH 'SJA'+Y,A2 WITH 'SJB'+Y,A3 WITH X
ENDFOR
LIST
COPY TO L2 FOR A3<6
SELECT 0
USE L2
DELETE FOR A3=3
PACK
LIST
WAIT
*1
SELECT L1.* FROM L1,L2 INTO DBF L3 WHERE L1.A3=L2.A3
BROWSE && SQL查询达到预想目的,出现28条记录(A3=1,2,4,5)。
*2
SELECT L1.* FROM L1,L2 INTO DBF L3 WHERE !(L1.A3=L2.A3)
BROWSE &&SQL查询没有达到预想目的,出现28条记录。为什么不是预想的4条记录(A3=3,6,7,8)。

RETURN

目的是在L1表中查询除去L2表的记录。
为什么第二次查询结果不是预想的4条记录(A3=3,6,7,8)。如何才能迅速产生预想的4条记录(A3=3,6,7,8)。

搜索更多相关主题的帖子: 问题 
2012-02-09 08:21
qingfameng
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:35
帖 子:964
专家分:3019
注 册:2010-2-6
收藏
得分:10 
回复panpande老师
(对不起,刚才说反了,重新另说了,望批评指正)
SELECT L1.* FROM L1,L2 INTO DBF L3 WHERE !(L1.A3=L2.A3) 出现28 条是对的。
假如没有 where 条件,他会出现 4*8=32 条。
原理是:select 查询时,以 L2 为准,一条条与 L1 比较。
L2 的第一条 A3 是1,L1 表里有1条,他不取 L1 的这一条,而取了了L1 的 其他7条。
L2 的第二条 A3 是2, L1 表里也有,他还是又取了L1 的其他7条。
依此类推,L2 表里共有4 条。一共 4*7=28。
要想达到目的,可以替换这一句:用
SELECT L1.* distinct FROM L1 INTO table L3 WHERE a3 not in (select a3 from L2)


 




[ 本帖最后由 qingfameng 于 2012-2-9 14:16 编辑 ]
2012-02-09 13:11
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:10 
查了一下資料,大致情況如下:

1.SQL涉及兩表查詢時,最簡單的查詢指令下,應用的是一種叫“內連接”的查詢結果,產生的是一個兩表交集的結果集合,忽略兩個表中無“連接”的記錄,也就是說,沒有子記錄的父記錄和沒有相應父記錄的子記錄都不會包含在結果集合中。在簡單情形之外,還有叫“外連接”的,分三種:Right Outer Join、Left Outer Join和Full Outer Join,都是SQL中含JOIN子句的查詢。具體文字太多,可以參看SQL命令使用手冊。

2.SQL查詢自動使用索引,也自動建立關聯,它按照連接條件(即WHERE子句)自動操作,是不由你決定的。換句話說,我們無法預料SQL如何自作聰明地選擇關聯字段,除非指定連接條件,這就是上述三種Outer Join的作用,通過像JOIN L1!L2 ON L1.A3=L2.A3這樣的形式來指定,才有可能達到目的。

3.資料介紹很明晰,SQL查詢確實是通過提取臨時表操作的,不單如此,甚至按照查詢條件的複雜性而一層一層地逐級生成查詢集合再進行集合交、並、補運算得到最終結果。這就是SQL指令之所以佔用大量內存的原因,在網上檢索,有心人曾專門測試SQL查詢耗用資源的情況,其結果是執行SQL查詢內存和CPU的佔用量暴增,大數據量下一旦超越可用內存80%的極限,就轉入虛擬內存使用,此時因硬盤慢而速度驟降(故而服務器硬盤必須選用速度更快的硬盤類型)。

4.SQL查詢的“快”,是指在遠程網絡環境下,把查詢的複雜動作交給服務器執行,而服務器的運算是在其本地機器上執行的,所以快,執行完後,把結果集合(通常是較少量的數據)再用遠程傳遞到請求中斷,這樣發出指令的機器就因為迴避了反復的遠程傳輸而覺得很快了(如果結果集合很大,不用TOP子句限制反饋的數據量,也一樣會停滯等待數據下載完畢)。但這種模式是把運算負荷全部壓到服務器的,如果有很多用戶同時發出類似大運算請求,服務器有可能承擔不起。現在的雲計算模式,其實就是為了解決這個問題,把計算分攤到多臺機器上,減輕某一臺機器太重的負擔。一般說,如果有條件,盡可能把運算交給客戶機自己承擔(除非敏感數據必須儲存在服務器上無法下載),採用離綫模型也比掛在網上遠程計算強。

[ 本帖最后由 TonyDeng 于 2012-2-9 17:17 编辑 ]

授人以渔,不授人以鱼。
2012-02-09 16:05
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
此處1樓的例子,屬於內連接,顯然SQL建立了自動關聯,根據共有字段,交叉連接產生出大量結果的集合。2樓的那條SQL語句,則屬於逐層篩選的用法,從一個集合中再查詢一個集合。如果要避免這種分級運算,就要用外連接指令,教SQL如何連接。

其實,樓主第二個目的,在傳統VFP索引算法下實現,只需要掃描表一趟,而不用反復篩選集合,耗用的內存絕對比SQL少,把兩個表同時全部調入內存中運算,也不至於會超標,用SQL多級運算,超標的危險性更高。

好像有個Inner Join能直接實現第一個目的。

[ 本帖最后由 TonyDeng 于 2012-2-9 17:18 编辑 ]

授人以渔,不授人以鱼。
2012-02-09 16:21
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
1樓代碼第二個目的,簡單的做法如下:按A3建立SET RELATION關聯,L1是主動表,L2是被動表,在L1移動的同時,L2的記錄指針必然指向L2.A3=L1.A3的記錄,但如果這條記錄不存在,那麼L2的EOF()為真,這樣,只要對L1遍歷一次,對每條L1記錄都檢測L2的EOF()真值,凡是為假的就是L2中沒有對應的記錄。

授人以渔,不授人以鱼。
2012-02-09 16:44
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9848
专家分:27241
注 册:2012-2-5
收藏
得分:0 
听君一席话,胜读十年书。一个字:高

坚守VFP最后的阵地
2012-02-09 17:09
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9848
专家分:27241
注 册:2012-2-5
收藏
得分:0 
回复 3楼 TonyDeng
SQL命令使用手冊 请传至QQ:243688667 。
谢谢了

坚守VFP最后的阵地
2012-02-09 17:18
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
回复 7楼 sdta
我沒有,只有張洪舉書上的介紹,也是紙質書。全部完整的SQL教材,看別人有沒有吧。

授人以渔,不授人以鱼。
2012-02-09 17:20
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9848
专家分:27241
注 册:2012-2-5
收藏
得分:0 
以下是引用TonyDeng在2012-2-9 17:20:58的发言:

我沒有,只有張洪舉書上的介紹,也是紙質書。全部完整的SQL教材,看別人有沒有吧。
从网上下了一个"微软SQL_参考手册"

坚守VFP最后的阵地
2012-02-09 19:49
panpende
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:4
帖 子:528
专家分:963
注 册:2009-4-27
收藏
得分:0 
谢谢TonyDeng老师详细讲述,对SQL查询有进一步了解。看来还是多用在傳統VFP索引算法下實現目的的语句,慎用SQL语句。

为了达到在L1表中查询除去L2表的记录的目的,我还是按TonyDeng老师的意见,采用按A3建立SET RELATION關聯,L1是主動表,L2是被動表,L1用 DELE FOR L1.A3=L2.A3  PACK 命令获得。

谢谢qingfameng老师在2楼对SQL查询的讲述。记得有一个高手用此特性做某组合的程序段,效果特快。

2012-02-11 09:04
快速回复:关于SELECT-SQL的问题
数据加载中...
 
   



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

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.038424 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved