2013-09-18 2 views
1

У меня есть две таблицы пользователя с той же схемой.объединить две таблицы и получить сумму, не выбрав все из огромной таблицы

| useraward_new |  | useraward_his | 
| User | Award |  | User | Award | 
| user1 | 5 |  | user1 | 1 | 
| user2 | 2 |  | user1 | 3 | 
|  |   |  | user2 | 4 | 
|  |   |  | user3 | 5 | 

useraward_new содержит данные о новейшем год и useraward_his содержит исторические данные. Разница в том, что «новый». Пользователь уникален, но «его». Пользователь не так «его» может содержать дублированные пользовательские данные.

Я хотел бы иметь

| useraward_total | 
| User | Award | 
| user1 | 9 | 
| user2 | 6 | 

UNION работает отлично. Но он возвращает все данные в исторической таблице, но нужны только данные для пользователей в новой таблице.

Я пробовал различные комбинации JOIN, UNION, SUM, ... но не повезло. Любая помощь будет оценена, спасибо!

+0

Спасибо за ответы. Производительность каждого запроса была измерена, и оба запроса Маркуса и Тима дают хорошую производительность. – PandaDrunkard

ответ

3
SELECT n.[User], n.Award + ISNULL(SUM(h.Award),0) AS Award 
FROM useraward_new n 
LEFT JOIN useraward_his h ON h.[User] = n.[User] 
GROUP BY n.[User], n.Award 
0

Вы должны выбрать из новой таблицы и сделать внутреннее соединение на исторической таблице:

SELECT User, SUM(Award) 
FROM useraward_new N 
INNER JOIN useraward_his H ON N.User = H.User 
GROUP BY User 

редактировать: Я думаю, что предполагает, что всегда будет эквивалентным пользователем в историческая таблица. В противном случае ответ Маркуса будет включать любых пользователей в новых, которые не находятся в исторической таблице.

0

Вы можете использовать EXISTS, чтобы выбрать только пользователей, которые находятся в новой таблице из таблицы истории. Затем используйте UNION ALL и GROUP BY потом:

SELECT X.[User], SUM(X.Award) AS Award 
FROM(
    SELECT [User], Award FROM useraward_new 
    UNION ALL 
    SELECT [User], Award FROM useraward_his h 
    WHERE EXISTS(SELECT 1 FROM useraward_new n WHERE h.[User] = n.[User]) 
) X 
GROUP BY [User] 

DEMO

0
SELECT Unew.User, Unew.Award + Uold.oldAwards 
FROM Useraward_new AS Unew 
LEFT JOIN 
(
    SELECT User, SUM(Award) as oldAwards 
    FROM useraward_his 
    GROUP BY User 
) Uold 
ON Unew.User = Uold.User 

Если большинство пользователей существуют в обеих таблицах нет необходимости фильтровать перед присоединиться, это будет больше накладными расходами, чем агрегирование ненужных строк ,

0

Пожалуйста, попробуйте:

select 
    a.[User], 
    a.Award+(select SUM(b.Award) from useraward_his b where a.[User]=b.[User]) Award 
from useraward_new a 
Смежные вопросы