2014-04-07 2 views
0

У меня есть запрос, где я пытаюсь подсчитать количество звонков, сделанных каждым сотрудником. Однако имя Employee не входит в таблицу Call, поэтому мне пришлось использовать Inner Join. Вот что я до сих пор. Я использую SQL Server 2008 R2Подсчет записей с помощью Inner Join

Select e.Name, count(1) 
From Employees e INNER JOIN Calls c on c.EmployeeID = e.TechID 
Where(c.Name LIKE 'John ') OR 
    (c.Name LIKE 'Sam ') OR 
    (c.Name LIKE 'Bob ') OR 
    (c.Name LIKE 'Mark') OR 
    (c.Name LIKE 'Mike') 
Group By e.Name 

По существу я ищу две колонки, имя сотрудника и количество вызовов, которые они сделали.

Запрос будет выполняться, но он длится очень долго, пока я, наконец, не убью его. Есть лучший способ сделать это?

+0

Что сказать план выполнения? Какие СУБД вы используете (Postgres, Oracle, Firebird, ...) –

+0

Я использую Sql Server 2008 r2 – user3272370

+1

Необходимость выполнить соединение перед поиском всегда является убийцей производительности, особенно ваша таблица «звонков» звучит как миллион записей строк. Вероятно, одним из способов ускорения работы является создание индекса в столбце имени сотрудника, получение всех идентификаторов сотрудников, которые называют LIKE John, Sam, Bob и т. Д., А затем использовать эту группу идентификаторов для выбора таблицы вызовов без необходимости присоединяться. – gerrytan

ответ

0

Попробуйте выполнить агрегацию в дополнительном запросе и затем присоединить его к таблице сотрудников.

SELECT 
    A.[Name], 
    B.[CallCount] 
FROM [Employees] A 
INNER JOIN (SELECT [EmployeeID], COUNT(*) [CallCount] FROM [Calls] GROUP BY [EmployeeID]) B 
ON  A.[TechID] = B.[EmployeeID] 
WHERE A.[Name] LIKE 'John ' 
    OR A.[Name] LIKE 'Sam ' 
    OR A.[Name] LIKE 'Bob ' 
    OR A.[Name] LIKE 'Mark' 
    OR A.[Name] LIKE 'Mike' 
1

Попробуйте это ..

Select e.Name, count(*) Total_Calls 
From Employees e INNER JOIN Calls c on c.EmployeeID = e.TechID 
Where c.Name IN ('John ','Sam ','Bob ','Mark ','Mike ') 
Group By e.Name 
0

Я согласен с gerrytan. Преступлением является строковая обработка (группировка и поиск). Вы можете хранить идентификатор для сотрудников в критериях поиска в таблице темпа, а затем в главном запросе, вы должны группировать по идентификатору сотрудника и найти идентификаторы, которые соответствуют в таблице темпа

CREATE #temptable 
(int id) 


SELECT e.Id 
INTO #temptable 
FROM Employees e 
WHERE (e.Name LIKE 'John ') OR 
    (e.Name LIKE 'Sam ') OR 
    (e.Name LIKE 'Bob ') OR 
    (e.Name LIKE 'Mark') OR 
    (e.Name LIKE 'Mike') 


Select e.Name, count(1) 
From Employees e INNER JOIN Calls c on c.EmployeeID = e.TechID 
Where e.Id IN (
    SELECT Id FROM #temptable 
) 
Group By e.Id 
Смежные вопросы