2010-04-15 32 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

相关问题