MS Access SQL如何消除重复值

问题描述 投票:0回答:1

我在这里查看了许多类似的帖子,以至于我的头在旋转,但似乎没有一个解决这个特定问题的方法,但这可能是因为我不明白答案。下面的查询由于在c表上的联接而产生具有重复的s.ID记录的结果。消除具有重复s.ID值的结果集中的行的最佳方法是什么?我宁愿使用MAX(c.ID)保留这些重复的记录,并消除其他记录。

Select (o.fld1 & ' ' & o.fld2) as Name, 
  g.name, 
  (Select Count(*) from sd where s.ID=sd.ID) as TheCount, 
  sm.*, 
  l.name, 
  t.name, 
  s.ID, 
  s.name, 
  c.ID
From ((((((
  s Inner Join c on s.fld2=c.fld2) 
  Inner Join o on s.oID=o.ID) 
  Inner Join g on s.gID=g.ID) 
  Left Join sm on s.smID=sm.ID) 
  Inner Join l on s.lID=l.ID) 
  Inner Join t on s.tID=t.ID) 
Where c.fld3 IN (1,3,5)
Order By s.ID ASC, c.ID ASC

这是一个简化,但我认为它涵盖了所有核心要素。例如,select子句中有更多项,但是至少有一个嵌入式SQL查询,一个构造字段名和一个“表。*”,如示例所示;根据用户定义的过滤条件,Where子句可能要复杂得多。

示例结果行可能是:

s.ID    c.ID   ...
1       1
1       3
2       3
2       5

我希望结果集中不返回第1行和第3行。将具有MAX(c.ID)的行保留在重复的s.ID行上。

sql ms-access-2007
1个回答
-1
投票

您可以只检查where子句以确认不存在具有较高c.ID值的s-c对。>

Select (o.fld1 & ' ' & o.fld2) as Name, 
  g.name, 
  (Select Count(*) from sd where s.ID=sd.ID) as TheCount, 
  sm.*, 
  l.name, 
  t.name, 
  s.ID, 
  s.name, 
  c.ID
From ((((((
  s Inner Join c on s.fld2=c.fld2) 
  Inner Join o on s.oID=o.ID) 
  Inner Join g on s.gID=g.ID) 
  Left Join sm on s.smID=sm.ID) 
  Inner Join l on s.lID=l.ID) 
  Inner Join t on s.tID=t.ID) 
Where not exists (select 1 from s s2 join c c2 on s2.fld2=c2.fld2 WHERE s2.ID=s.ID and c2.ID>c.ID and c2.ID IN (1,3,5))
Order By s.DateAndTime ASC, s.fld9 ASC, c.fld4 ASC
© www.soinside.com 2019 - 2024. All rights reserved.