設(shè)為首頁收藏本站Access中國

Office中國論壇/Access中國論壇

 找回密碼
 注冊

QQ登錄

只需一步,快速開始

返回列表 發(fā)新帖
查看: 3591|回復(fù): 6
打印 上一主題 下一主題

[查詢] 【Access小品】三層功夫 -- 兩表聯(lián)接的特殊處理

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
1#
發(fā)表于 2015-4-28 16:19:43 | 只看該作者 回帖獎勵 |倒序?yàn)g覽 |閱讀模式
  版友chinasa同志在論壇提出了一個關(guān)于SQL聯(lián)接的問題,這個問題比較有趣。其有趣之處在于需要采用一種比較特殊的表達(dá)式來處理兩表間的聯(lián)接關(guān)系。問題的內(nèi)容如下:

  1.業(yè)務(wù)表的代碼全部是標(biāo)準(zhǔn)的5位代碼。
  2.合約中的代碼可能是5位代碼或2位代碼,或者任意組合(中間以斜杠分開)。
  3.其中2位代碼是5位代碼的前兩位。

  需求是:當(dāng)合約號相同,業(yè)務(wù)表代碼被包含在合約表的代碼中,則取合約價格。

  就chinasa同志的數(shù)據(jù)表結(jié)構(gòu)來看,其合約表的代碼字段是不符合范式理論的第一范式的,也就是說該字段的一條記錄中存在多值。范式理論作為關(guān)系數(shù)據(jù)庫的基礎(chǔ),是非常重要的,通常情況下數(shù)據(jù)表的設(shè)計均應(yīng)該遵循范式。不過過分強(qiáng)調(diào)這一點(diǎn),有可能落入唯范式的陷阱。有時候根據(jù)商務(wù)邏輯的特點(diǎn),適度的違反一下范式可能比完全遵循范式在效率上會更高一些。當(dāng)然,這是在你充分理解范式的基礎(chǔ)上,才應(yīng)該做出的選擇。沒有這個基礎(chǔ),那就是瞎胡鬧胡球搞。本問題的原型無法全面觀察,所以不能判斷chinasa同志是不是瞎胡鬧胡球搞。

  暫且不論chinasa同志不論是否瞎胡鬧胡球搞。本例想要闡釋的是另外一個問題,這個問題事關(guān)表聯(lián)接的處理。寫一個兩表之間的內(nèi)聯(lián)接,對于大多數(shù)版友來說并不困難。不過寫兩表或者多表的聯(lián)接,大體有三層功夫。這些功夫體現(xiàn)在ON子句的處理上。第一層功夫是說你知道兩個表之間一些對應(yīng)字段用等號表示聯(lián)接關(guān)系;第二層功夫是說你知道兩表之間的對應(yīng)字段不僅可以用等號表示聯(lián)接關(guān)系,還可以用大于、小于等關(guān)系運(yùn)算符表示。

  其實(shí),Access的幫助文檔只能幫你掌握第二層功夫,因?yàn)檫@個文檔對ON子句只解釋到用關(guān)系運(yùn)算符聯(lián)接兩個表的對應(yīng)字段。如果你的大腦還不至于太笨的話,你會知道關(guān)系運(yùn)算符聯(lián)接字段名,實(shí)際上是一個邏輯表達(dá)式。那么由此推理,ON子句應(yīng)該是一個邏輯表達(dá)式。不知道你理解了沒有,為什么我說要將其理解為邏輯表達(dá)式而不是僅僅是關(guān)系表達(dá)式呢?答案是,邏輯表達(dá)式更為廣泛。也就是說ON子句不一定寫成關(guān)系表達(dá)式,而可以更廣泛的寫成邏輯表達(dá)式。知道了這一點(diǎn),你就獲得了第三層功夫。

  本例中當(dāng)然是需要第三層功夫。說起來,功夫高,并不意味著功夫復(fù)雜。其實(shí)只是一個境界而已,進(jìn)入了這個境界,一切都很簡單。本例的寫法也不復(fù)雜,大體可以這樣去寫:

SELECT a.*, b.合約價格
FROM 業(yè)務(wù)表 AS a INNER JOIN 合約表 AS b ON (instr(b.代碼,a.業(yè)務(wù)代碼)>0) AND (a.合約號=b.約號);

  注意instr(b.代碼,a.業(yè)務(wù)代碼)>0,雖然這也是一個關(guān)系表達(dá)式,但這個關(guān)系表達(dá)式中b.代碼與a.業(yè)務(wù)代碼并不在關(guān)系運(yùn)算符的兩側(cè),所以將這個表達(dá)式理解為邏輯表達(dá)式更為恰當(dāng)。這個表達(dá)式是表示a.業(yè)務(wù)代碼是否包含在b.代碼中。當(dāng)然表示這個計算的表達(dá)式還可以有多種,比如你還可以用StrComp函數(shù)來計算。

示例:

視圖:





本帖子中包含更多資源

您需要 登錄 才可以下載或查看,沒有帳號?注冊

x

評分

參與人數(shù) 1經(jīng)驗(yàn) +6 收起 理由
zpy2 + 6 錛圴甯侊級浼樼鍘熷垱鏁欑▼銆佺鐞嗗緩.

查看全部評分

本帖被以下淘專輯推薦:

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享分享 分享淘帖1 訂閱訂閱
2#
發(fā)表于 2015-4-28 16:44:00 | 只看該作者
謝謝分享
回復(fù)

使用道具 舉報

點(diǎn)擊這里給我發(fā)消息

3#
發(fā)表于 2015-4-29 14:03:12 | 只看該作者
學(xué)習(xí) 了,謝謝分享
4#
發(fā)表于 2015-5-2 21:38:46 | 只看該作者
謝謝,能靈活使用SQL真好!
5#
發(fā)表于 2015-7-20 14:27:53 | 只看該作者
學(xué)習(xí)學(xué)習(xí),謝謝分享!
6#
發(fā)表于 2015-7-20 14:28:04 | 只看該作者
學(xué)習(xí)學(xué)習(xí),謝謝分享!
7#
發(fā)表于 2016-8-20 15:14:53 | 只看該作者
已經(jīng)下載學(xué)習(xí),謝謝
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則

QQ|站長郵箱|小黑屋|手機(jī)版|Office中國/Access中國 ( 粵ICP備10043721號-1 )  

GMT+8, 2025-7-16 18:43 , Processed in 0.111372 second(s), 34 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回復(fù) 返回頂部 返回列表