2015-09-27 54 views
0

我有2個表如何根據MASTER條目獲取最新的DETAIL項?

1.用戶主 USER_ID,USER_FULL_NAME,user_dob ...等等

2.登錄信息 LOGIN_ID,login_user_id,login_time,login_date,logout_time

問題

第2臺具有對用戶主表ID行

我需要一個連接的n個,但條件是,它應該向用戶顯示

例如 USER_FULL_NAME的只有最後一次登錄數據,USER_LOGIN,user_logout所以如果您想爲單個用戶的結果上...

+0

你想爲特定用戶或所有用戶使用嗎? – Amit

+0

@允許所有用戶 –

回答

2

,你可以使用一個簡單的INNER JOINORDER BYTOP 1組合:

SELECT TOP 1 user_full_name, login_time, login_date, logout_time 
FROM Users INNER JOIN Logins ON 
    Users.user_id = Logins.user_id 
WHERE 
    Users.user_id = @user_id 
ORDER BY login_date DESC, login_time DESC 

(見SQLFiddle

如果你想爲所有用戶的結果,你可以使用CROSS APPLY

SELECT user_full_name, l.* 
FROM Users u CROSS APPLY (
    SELECT TOP 1 login_time, login_date, logout_time 
    FROM Logins 
    WHERE 
    u.user_id = Logins.user_id 
    ORDER BY login_date DESC, login_time DESC 
) l 

(見SQLFiddle

1

此問題的一個常見的解決方案是使用row_number窗口功能和過濾器,用於每個分區中行號爲1的行(由用戶按日期/時間排序):

WITH UserDetails AS (
    SELECT 
     * 
     , ROW_NUMBER() OVER (PARTITION BY login_user_id 
          ORDER BY login_date DESC, login_time DESC) AS RN 
    FROM LoginDetails 
) 
SELECT * 
FROM UserMaster M 
JOIN UserDetails D ON M.user_id = D.login_user_id 
WHERE D.RN = 1; 
1

你可以嘗試在JOIN子句中使用TOP 1:

SELECT a.user_id, a.user_full_name, b.login_id... 
FROM UserMaster a INNER JOIN Logins b ON b.login_date = 
(
    SELECT TOP 1 login_date 
    FROM Logins 
    WHERE login_user_id = a.user_id 
    ORDER BY login_date DESC 
)