内心加入表自己

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)