2014-02-04 12 views
1

Я ВГ столам события, сеанса, sessionspeaker, динамика и Сотрудник таблицы событий имеют EventID, как PK, сессии таблицы может имеют multiple Eventid и имеет sessionid как pk, динамик таблица имеет speakerid, как рк и имеет EmpId колонка, сотрудника таблица имеет EmpId, как PK. sessionpeaker таблица есть (sessionid, динамик) как pk. Теперь я WUD хотел ВГА все EventID с TOPMOST emplID таким образом, что идентификатор события является уникальнымполучить уникальные записи из таблицы после того, как присоединиться к

SELECT  emp.EmployeeID, e.EventID 
FROM Event AS e INNER JOIN Session ON e.EventID = Session.EventID left outer JOIN 
SessionSpeaker ON Session.SessionID = SessionSpeaker.SessionID INNER JOIN 
Speaker ON SessionSpeaker.EmployeeID = Speaker.EmployeeID INNER JOIN 
Employee AS emp ON Speaker.EmployeeID = emp.EmployeeID 

этот запрос возвращает

EmployeeID EventID 
5351   310 
5351   310 
5352   299 
5352   300 
5352   301 
5352   302 
5352    303 
5352   314 
5352   315 

это то, что я не хочу, я хочу, уникальный Идентификатор события и самый старший employeeID Пожалуйста, дайте мне знать простой способ решить эту проблему. будет GroupBy, имея или считать помощь в этом вопросе

ответ

3

Я хочу уникальный идентификатор события и верхний EmployeeID

Просто GROUP BY e.EventID и выберите MAX(EmployeeId):

SELECT 
    e.EventID, 
    MAX(emp.EmployeeID) AS TopMostEmpId, 
FROM Event AS e 
INNER JOIN Session   ON e.EventID     = Session.EventID 
INNER JOIN SessionSpeaker ON Session.SessionID   = SessionSpeaker.SessionID 
INNER JOIN Speaker   ON SessionSpeaker.EmployeeID = Speaker.EmployeeID 
INNER JOIN Employee AS emp ON Speaker.EmployeeID  = emp.EmployeeID 
GROUP BY e.EventID 

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

WITH CTE AS 
(
    SELECT 
     e.EventID, 
     emp.EmployeeID, 
     e.EventName, 
     emp.EmployeeName, 
     ... 
     ROW_NUMBER() OVER(PARTITION BY e.EventID 
         ORDER BY emp.EmployeeId DESC) AS RN 
    FROM Event AS e 
    INNER JOIN Session   ON e.EventID     = Session.EventID 
    INNER JOIN SessionSpeaker ON Session.SessionID   = SessionSpeaker.SessionID 
    INNER JOIN Speaker   ON SessionSpeaker.EmployeeID = Speaker.EmployeeID 
    INNER JOIN Employee AS emp ON Speaker.EmployeeID  = emp.EmployeeID 
) 
SELECT * 
FROM CTE 
WHERE RN = 1; 
+0

Спасибо wa Jazakallah ukhair, Первый запрос в порядке, однако второй запрос устраняет всю запись, которая имеет RN> 1. Однако я хочу, чтобы была показана первая запись для каждого, чей RN> 1 – shomaail

+0

@shomaail El 3afo мой брат, вы приветствуйте любое время :) Да, второй запрос исключает все записи, которые имеют «RN> 1», потому что я написал его «WHERE RN = 1', но зачем вам нужны записи, которые имеют« RN> »? чего вы пытаетесь достичь? –

+0

Как я писал в вопросе, я хочу, чтобы самый верхний идентификатор employeeID только – shomaail

0
SELECT  emp.EmployeeID, distinct e.EventID 
FROM Event AS e INNER JOIN Session ON e.EventID = Session.EventID left outer JOIN 
SessionSpeaker ON Session.SessionID = SessionSpeaker.SessionID INNER JOIN 
Speaker ON SessionSpeaker.EmployeeID = Speaker.EmployeeID INNER JOIN 
Employee AS emp ON Speaker.EmployeeID = emp.EmployeeID 

group by e.EventID 
+0

Msg 156, Level 15, State 1, Line 1 Неправильный синтаксис около ключевого слова 'отчетливый'. – shomaail

+1

Это не сработает, вы не можете использовать 'distinct' таким образом. Кроме того, он не даст желаемых результатов. –

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