如何在SQL Server SELECT中的第二个连接表中按ID选择每个记录的一个顶部?

时间:2015-03-29 09:23:02

标签: sql-server left-join

这是我的代码

SELECT DISTINCT
   E.EquipmentId, E.Name, E.KakhdaryNo, E.PropertyNo, 
   E.InstallationPlace, E.InstallationDate, E.BuyDate,
   Vt.TypeCaption, E.VisitChosen, E.LastVisitDate, V.VisitReport
FROM 
   TblEquipment E 
LEFT JOIN 
   TblVisitType Vt ON E.VisitType = Vt.VisitTypeId 
LEFT JOIN 
   TblVisit V ON E.EquipmentId = V.EquipmentId 
WHERE 
   1=1 
   AND E.Deleted <> 'True'
GROUP BY 
   E.Name

我收到错误:

  

Msg 8120,Level 16,State 1,Line 1
  列'TblEquipment.EquipmentId'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。

如果我不按照这样显示的结果使用group:

This is result

所以你可以看到装备ID 15是重复的......我只想要其中一个..我更喜欢顶级的,我的意思是更新的记录

请帮我怎么做?

2 个答案:

答案 0 :(得分:1)

  

您正在使用Group By子句,因此您必须使用Aggregate函数   对于每个选择列,或者您必须使用“分组依据”中的列   条款

e.g

select a,b,max(c),min(d) from  table_Name group by a,b

在你的情况下

SELECT 
Max(E.EquipmentId),
E.Name,
Max(E.KakhdaryNo),
Max(E.PropertyNo),
Max(E.InstallationPlace),
Max(E.InstallationDate),
Max(E.BuyDate),
Max(Vt.TypeCaption),
Max(E.VisitChosen),
Max(E.LastVisitDate),
Max(V.VisitReport)
FROM 
TblEquipment E 
LEFT JOIN 
TblVisitType Vt 
on
 E.VisitType=Vt.VisitTypeId 
LEFT JOIN 
TblVisit V 
on 
E.EquipmentId=V.EquipmentId 
WHERE 1=1 AND E.Deleted <> 'True'
Group BY E.Name`

答案 1 :(得分:0)

正如我在评论中提到的那样,您正在选择一堆non aggregated column's并在group by中只保留一个Sql Server中不允许的内容。要删除重复的行,请使用row_number窗口函数。

同时删除1=1子句中不需要的where条件。

如果没有错,这就是你要找的。

SELECT EquipmentId,
       NAME,
       KakhdaryNo,
       PropertyNo,
       InstallationPlace,
       InstallationDate,
       BuyDate,
       .TypeCaption,
       VisitChosen,
       LastVisitDate,
       VisitReport
FROM   (SELECT Row_number()OVER(partition BY E.EquipmentId ORDER BY order_by_column) AS RN,
               E.EquipmentId,
               E.NAME,
               E.KakhdaryNo,
               E.PropertyNo,
               E.InstallationPlace,
               E.InstallationDate,
               E.BuyDate,
               Vt.TypeCaption,
               E.VisitChosen,
               E.LastVisitDate,
               V.VisitReport
        FROM   TblEquipment E
               LEFT JOIN TblVisitType Vt
                      ON E.VisitType = Vt.VisitTypeId
               LEFT JOIN TblVisit V
                      ON E.EquipmentId = V.EquipmentId
        WHERE  E.Deleted <> 'True') A
WHERE  RN = 1