2010-04-15 33 views
2

我有兩張表invoices和pending_payments,它們都具有以下共同的行:invoice_id和balance。我想要做一個選擇在MySQL中是會這樣的工作:我如何有條件地從兩個表中選擇一個字段?

[僞代碼]

if(invoice_id exists in pending_payments table) { 
    select balance from pending_payments where invoice_id = yadayadayada 
} else { 
    select balance from invoices where invoice_id = yadayadayada 
} 

這是可行的,即使在MySQL?如果是這樣,怎麼樣?

回答

4
select i.invoice_id, coalesce(pp.balance, i.balance) as Balance 
from invoices i 
left outer join pending_payments pp on i.invoice_id = pp.invoice_id 

讓我知道如果可以有多個排在pending_payments爲同一invoice_id,我將提出一個替代的解決方案。

+0

哇,謝謝OrbMan那個快啊!會給它一點點擊並讓你知道它是如何工作的。 – freakwincy 2010-04-15 14:15:22

+0

不,invoice_id是獨一無二的,而且您的解決方案非常精美。謝謝! 看起來你犯了一個小錯誤 - 合併聲明後的第一個值應該是pp.balance。不是批評,只要指出其他任何可能遇到類似問題的人。 – freakwincy 2010-04-15 14:43:26

+0

謝謝,我修復了錯字。 – RedFilter 2010-04-15 14:48:29

1

我喜歡OrbMan的解決方案(我認爲它是最直觀的),但這裏有另一種方法 - 從一張表中選擇全部,然後從第二個中選擇所有。

select invoice_id, balance from pending_payments where invoice_id = yadayadayada 
UNION 
select invoice_id, balance from invoices where invoice_id = yadayadayada 
    AND invoice_id not in (select invoice_id from pending_payments) 

作爲一個附註,有人指出,在某些系統上,這實際上更快。我沒有提出這樣的說法,但如果速度是一個問題,這是值得嘗試的。

另外,如果你需要包括源列(如未決或發票),很容易做這樣的這樣:

select 'pending' as source, invoice_id, balance from pending_payments where invoice_id = yadayadayada 
UNION 
select 'invoice' as source, invoice_id, balance from invoices where invoice_id = yadayadayada 
    AND invoice_id not in (select invoice_id from pending_payments) 
+0

非常感謝霍根。您的解決方案非常簡潔。我也試過了(沒有源列,因爲我不需要它),只是爲了確保它能夠工作 - 而且確實如此! – freakwincy 2010-04-15 14:52:49

+0

不客氣。瞭解不止一種方法來做事情總是很好的(在SQL中,總有不止一種方法來做事)。 – Hogan 2010-04-15 20:31:57

相關問題