Dav*_*ong 5 sql sql-server sql-server-2008
我有一个使用两个标识列的表,我们称之为id和userid.ID在每条记录中都是唯一的,而userid对用户来说是唯一的,但是在许多记录中.
我需要做的是通过userid获取User的记录,然后将该记录加入到我们为用户提供的第一条记录中.查询的逻辑如下:
SELECT v1.id, MIN(v2.id) AS entryid, v1.userid
FROM views v1
INNER JOIN views v2
ON v1.userid = v2.userid
Run Code Online (Sandbox Code Playgroud)
我希望我不必将表连接到处理代码的min()部分的子查询,因为这看起来很慢.
ype*_*eᵀᴹ 13
我想(并不完全清楚)你想为每个用户找到最小的表id行,每个用户一行.
在这种情况下,您使用子查询(派生表)并将其连接到表:
SELECT v.*
FROM views AS v
JOIN
( SELECT userid, MIN(id) AS entryid
FROM views
GROUP BY userid
) AS vm
ON vm.userid = v.userid
AND vm.entryid = v.id ;
Run Code Online (Sandbox Code Playgroud)
如果您喜欢,也可以使用公用表表达式(CTE)编写以上内容:
; WITH vm AS
( SELECT userid, MIN(id) AS entryid
FROM views
GROUP BY userid
)
SELECT v.*
FROM views AS v
JOIN vm
ON vm.userid = v.userid
AND vm.entryid = v.id ;
Run Code Online (Sandbox Code Playgroud)
两者在索引上都非常有效(userid, id).
使用SQL-Server,您可以使用ROW_NUMBER()window函数编写:
; WITH viewsRN AS
( SELECT *
, ROW_NUMBER() OVER (PARTITION BY userid ORDER BY id) AS rn
FROM views
)
SELECT * --- skipping the "rn" column
FROM viewsRN
WHERE rn = 1 ;
Run Code Online (Sandbox Code Playgroud)