如何仅返回左连接中表的最大行

vol*_*one 0 sql sql-server sql-server-2012

我有一张包含汽车信息的表格 dbo.Car

CarID | Make      | Model
23      Volvo       XC90
40      Chevrolet   Camaro
46      BMW         Z4   
Run Code Online (Sandbox Code Playgroud)

还有另一个表,dbo.CIS其中列出了其他信息.它是这样的:

CarID | Dist | U1 | U2 | U3 | U4 | U5 -- U22
23      180    65   94   80   56   88    71
23      1170   68   93   24   23   19    93
40      908    89   15   68   46   59    31
46      500    10   20   30   40   50    35
46      2300   60   62   44   52   75    99
Run Code Online (Sandbox Code Playgroud)

数据在这个表中意味着什么并不重要.但是,我想加入的CarID,只返回1行中具有的最高值Dist从列dbo.CIS时CarID似乎比在表一次表.

所以对于CarID 23我想要归还:

CarID | Make   | Model | CarID | Dist | U1 | U2 | U3 | U4 | U5 -- U22
23      Volvo    XC90    23      1170   68   93   24   23   19    93
Run Code Online (Sandbox Code Playgroud)

到目前为止,我已经尝试过这样做不起作用(我仍然从dbo.CIS表中获取两行)

SELECT
 c.CarID,
 c.Make,
 c.Model,
 cis.U1,
 cis.U2,
 cis.U3,
 cis.U4,
 cis.U5
 ....
 cis.U22
FROM
 dbo.Car c
LEFT JOIN
 (SELECT
  MAX(Dist) AS Dist,
  U1, 
  U2,
  U3, 
  U4, 
  U5
  ... 
  U22
  FROM dbo.CIS
  GROUP BY
  U1, 
  U2,
  U3, 
  U4, 
  U5
  ... 
  U22
  ) AS cis
ON
 cis.CarID = c.CarID
WHERE c.CarID = 23
Run Code Online (Sandbox Code Playgroud)

如何只返回包含Car表中信息的1行(顺便说一下,它没有重复项)和CIS可能有重复信息的表或根本没有给定信息的表CarID.我想从存在重复项时列具有最高值的CIS表中返回数据Dist.

我应该补充一点,这只是一个涉及许多表和连接的相当大的SQL查询的片段.因此,我需要在同一个查询中使用任何解决方案而不是单独创建临时表.

Sea*_*nge 9

这是利用这种方法的一种方法ROW_NUMBER.

with myCte as
(
    select ROW_NUMBER() over(partition by CarID order by Dist desc) as RowNum
        , CarID
        , Dist
        , U1
        , U2
    from CIS
)

select * --Your column names here
from Car c
join myCte cis on c.CarID = cis.CarID and cis.RowNum = 1
Run Code Online (Sandbox Code Playgroud)