技術(shù) 點(diǎn)
- 技術(shù)
- 點(diǎn)
- V幣
- 點(diǎn)
- 積分
- 21536
|
版友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
評分
-
查看全部評分
|