2012-01-25 41 views
3

我已經得到了多數民衆贊成讓我的大腦融化一個非常複雜的查詢。選擇這樣或那樣的但不能同時

SELECT abunchOfStuff, r.xyz as netsell 
FROM normalmtm n 
JOIN mtmprogram m ON (
    m.mtmprogram = n.loanprogram 
    AND m.investor = 'Xyzzy' 
) 
JOIN rates as r on (
    r.term >= '2012-01-01' 
    AND r.investor = m.investor 
    AND r.rate = n.rate 
    AND r.program = m.basenormal 
    AND r.clientcode = n.clientcode 
) 
LEFT OUTER JOIN mtmadjustments as ad ON (
    ad.loannumber = n.loannumber 
    AND ad.investor = m.investor 
) 
WHERE n.loannumber = '12345678' 
AND n.clientcode = 10 
ORDER BY netsell DESC LIMIT 1 

這是從一堆他們中選擇最大的netsell。現在,我不能完全理解的棘手部分是rates表可能會或可能不會匹配n.clientcode。如果它不匹配,我想使用0的客戶端代碼,它本質上是一個通配符。

現在我做clientcode具體的查詢,如果它沒有返回我與clientcode = 0這樣了查詢...它好像我可以換這兩個東西放在一起莫名其妙。

我看着EXISTS或NOT EXISTS子查詢,但我無法弄清楚如何在這個例子中使用它,我什至不知道它會是合適的。

任何幫助表示讚賞!

+0

所以如果在利率沒有記錄與該客戶端的代碼,用於該投資者,速度和程序和客戶端代碼0的速度? – Stu

+0

看起來像你的標題是誤導性的。你不是選擇其中的一個,而是將'r.clientcode'與一個值或另一個值進行比較,是正確的? –

回答

0
SELECT abunchOfStuff, ISNULL(r.xyz, r2.xyz) as netsell 
FROM normalmtm n 
JOIN mtmprogram m ON (
    m.mtmprogram = n.loanprogram 
    AND m.investor = 'Xyzzy' 
) 
LEFT OUTER JOIN rates as r on (
    r.term >= '2012-01-01' 
    AND r.investor = m.investor 
    AND r.rate = n.rate 
    AND r.program = m.basenormal 
    AND r.clientcode = n.clientcode 
) 
LEFT OUTER JOIN rates as r2 on (
    r2.term >= '2012-01-01' 
    AND r2.investor = m.investor 
    AND r2.rate = n.rate 
    AND r2.program = m.basenormal 
    AND r2.clientcode = 0 
) 
LEFT OUTER JOIN mtmadjustments as ad ON (
    ad.loannumber = n.loannumber 
    AND ad.investor = m.investor 
) 
WHERE n.loannumber = '12345678' 
AND n.clientcode = 10 
ORDER BY netsell DESC LIMIT 1 
+0

是...我認爲這會工作。非常好!我不知道爲什麼我不考慮使用IFNULL,我在其他情況下使用它時,我需要返回零而不是NULL。 –

0

IFNULL()的應用在clientcode的加入應該做的伎倆

AND r.clientcode = IFNULL(0, n.clientcode) 

編輯:也許我沒有完全理解你的問題......你說你要零的時候他們不這樣做匹配,所以最初我在字段爲空時提出了一個選項,所以你得到0來匹配r.clientcode。當第二個值爲空時,IFNULL輸出第一個值,如果第二個值不爲空,則輸出第二個值。

但是,如果你需要做1)檢查是否匹配; 2)如果他們這樣做,加盟,3),如果他們不這樣做,加入與零值......你可能需要一個子查詢

AND r.clientcode = (IFNULL(0, select nn.clientcode FROM normalmtm nn where r.clientcode = nn.clientcode and nn.clientcode=n.clientcode)) 

類似的東西,也許......

+0

這將如何工作?它每次只會得到'0'。 –

+0

對不起,我想率紀錄的10 n.clientcode,除非有不匹配的話,我想它來搭配n.clientcode = 0 –

相關問題