2010-04-15 6 views
2

У меня есть два табличных счета и 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

+0

Нет, invoice_id уникален, и ваше решение работает красиво. Благодаря! Кажется, вы сделали небольшую ошибку, хотя первое значение после утверждения coalesce должно быть pp.balance. Не критикуйте, вы просто указатель на всех, кто мог столкнуться с подобной проблемой. – freakwincy

+0

Спасибо, я исправил опечатку. – RedFilter

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

+0

Добро пожаловать. Всегда полезно знать более чем один способ сделать что-то (и в SQL всегда есть более чем один способ сделать что-то.) – Hogan

Смежные вопросы