2012-06-06 4 views
1

У меня есть следующие таблицы MySQL, где B_ID является внешний ключ, ссылающийся на ID колонке TABLE_B:MySQL SUM различающиеся строки на основе внешнего ключа без подзапроса

---------- ----------- 
|Table_A | |Table_B | 
---------- ----------- 
|B_ID int| |ID int | 
---------- |VALUE int| 
       ----------- 

Я хочу, чтобы вычислить сумму VALUE в таблице_B, рассматривая только идентификаторы, которые отображаются в качестве внешних ключей в таблице_A. Кроме того, я хочу добавить каждую строку в Table_B не более одного раза.

Так, если таблицы были заполнены следующими данными:

------ ------------ 
|B_ID| |ID | VALUE| 
------ ------------ 
|1 | |1 | 50 | 
|2 | |2 | 100 | 
|2 | |3 | 200 | 
------ ------------ 

сумма будет 150 (вычисляется как 50 + 100).

Запрос Я использую сейчас:

SELECT SUM(b.VALUE) 
FROM Table_B b 
WHERE b.id IN (SELECT DISTINCT B_ID FROM Table_A) 

Однако, я хотел бы избежать подзапрос, если вообще возможно. Любые идеи о том, как это сделать без подзапросов?

Примечание: этот запрос сам является подзапросом в более крупном запросе, поэтому он может выбирать только один столбец.

ответ

1

Это не исключает подзапросы, но было бы более эффективным, если у вас есть несколько записей в a и много в b:

SELECT SUM(value) 
FROM (
     SELECT DISTINCT b_id 
     FROM a 
     ) a 
JOIN b 
ON  b.id = a.b_id 

Создать индекс на a.b_id для этого, чтобы работать быстро.

Если количество записей в b и их количество в a, ваш первоначальный запрос будет быстрее. Предложение индекса по-прежнему применяется.

+0

Спасибо. Это хороший подход, хотя я не могу использовать его в своем реальном сценарии, потому что запрос будет вложен в более крупный запрос, а некоторые дополнительные ограничения на Table_A не будут работать из-за недоступности некоторых полей (в основном, проблема, заявленная здесь http://bugs.mysql.com/bug.php?id=16029) – Epicurus

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