2013-08-05 2 views
0

Я вернулся к аналогичной проблеме, которую я имел ранее. Это должно быть простой вещью, но я не могу обойти ее. Вот обзор таблиц и то, что я пытаюсь достичь с помощью этого подзапроса. Я использую SQL Server 2008.SQL Sub Query при подключении к таблице

Пользователи Это содержит список пользователей

Войти Аудит Содержит список попыток входа в систему. Он держит идентификатор_пользователь и loginDate (DateTime поле)

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

Вот мой вопрос, который будет иметь смысл с точки зрения мирян! ;-)

SELECT u.userID, u.fName, u.sName, l.loginDate 
    FROM Users AS u LEFT OUTER JOIN 
         (SELECT TOP (1) loginDate, userID 
         FROM LoginAudit) AS l ON l.userID = u.userID 
    WHERE (u.cliID = 1) 

Это просто отодвигает последний loginDate для последнего пользователя, вошедшего в систему. Я хотел всех пользователей возвращаться независимо, если они вошли в систему или нет.

Любая помощь будет оценена по достоинству.

Благодаря ник

ответ

1
select a.userid, a.fName, a.sName, 
    max(b.loginDate) 
from 
    users a 
    left outer join lastLogin b on a.userid = b.userid 
group by a.userid, a.fName, a.sName 
+0

Отлично. Спасибо! –

0

Вы хотите заменить подзапроса с

SELECT userID, max(loginDate) as lastLogin FROM LoginAudit GROUP BY userID 

А потом заменить "l.loginDate" в главном запросе с "l.lastLogin"

Функциональность вы want обеспечивается функцией MAX() в агрегированном запросе, а не в функции TOP().

+0

Я только что попытался пометить оба, но не мог так выбрать первый ответ. Оба правильные! Большое спасибо –