【问题标题】:Distinct only one column in sql [duplicate]在sql中仅区分一列[重复]
【发布时间】:2014-06-04 16:26:35
【问题描述】:

我有一个查询,我只想在一列中有不同 - InjuryScenario.id,现在它要求一个错误 - 我怎么能用这个查询来做到这一点:

SELECT TOP (10) 
    Cause.Cause_name, 
    City.City_name, 
    distinct InjuryScenario.InjuryScenario_id,
    InjuryScenario.Date, 
    Place.Place_name, 
    Media.Media_name, 
    InjuryScenario.InjuryDesc, 
    Media.MediaType_name 
FROM InjuryScenario 
INNER JOIN Cause 
    ON InjuryScenario.Cause_id = Cause.Cause_id 
INNER JOIN PlaceDet 
    ON InjuryScenario.InjuryScenario_id = PlaceDet.InjuryScenario_id 
INNER JOIN City 
    ON PlaceDet.City_id = City.City_id 
INNER JOIN Place 
    ON InjuryScenario.Place_id = Place.Place_id 
INNER JOIN Media2InjuryScenario 
    ON InjuryScenario.InjuryScenario_id = Media2InjuryScenario.InjuryScenario_id 
INNER JOIN Media 
    ON Media2InjuryScenario.Media_id = Media.Media_id 
ORDER BY InjuryScenario.TimeStamp DESC

谢谢

【问题讨论】:

  • DISTINCT 对所有列进行操作以生成唯一的集合。您可以 GROUP BY 子查询(或 CTE)中的单个列,然后将其用于 JOIN 返回您想要的详细信息。
  • 请格式化您的代码,使其更具可读性。
  • 抱歉,什么是 CTE?能给我举个例子吗?
  • distinct 删除结果集中的重复项。如果您不希望特定列具有重复数据,则需要专门将它们过滤掉,distint 不是为此。您使用哪种 DBMS?
  • 正如@nivas 所说,最好先将查询更改为不创建重复行。您可以使用重复的问题,但发布一些示例数据可能会产生更好的重复数据删除方法。具体来说,InjuryScenario(或与之直接相关的事物)看起来可能是罪魁祸首。如果InjuryScenario.InjuryScenario_id 应该是唯一的,那么应该使用其他列中的哪一行?据推测,InjuryDescInjuryScenario.Date 中的每个 id 都有多个值...

标签: sql


【解决方案1】:

SELECT DISTINCT是一个关键字,不能分开

您很可能在连接表之间存在一对多的关系。您的第一步是找到哪一个,然后可能执行 Row_Number() 将其划分为列,然后选择您想要的一个

假设 PlaceDetInjuryScenario 的多对一并且您只想加入第一个在 PlaceDet 中记录(如果您按日期订购),然后

您的代码将如下所示

SELECT TOP (10) 
    Cause.Cause_name, 
    City.City_name, 
    InjuryScenario.InjuryScenario_id,
    InjuryScenario.Date, 
    Place.Place_name, 
    Media.Media_name, 
    InjuryScenario.InjuryDesc, 
    Media.MediaType_name 
FROM InjuryScenario 
INNER JOIN Cause ON InjuryScenario.Cause_id = Cause.Cause_id 
INNER JOIN (SELECT InjuryScenario_id, ROW_NUMBER() OVER(PARTITION BY InjuryScenario_id ORDER BY InjuryDate ASC) AS RowRank FROM PlaceDet) PlaceDet ON (InjuryScenario.InjuryScenario_id = PlaceDet.InjuryScenario_id AND PlaceDet.RowRank = 1)
INNER JOIN City ON PlaceDet.City_id = City.City_id 
INNER JOIN Place ON InjuryScenario.Place_id = Place.Place_id 
INNER JOIN Media2InjuryScenario ON InjuryScenario.InjuryScenario_id = Media2InjuryScenario.InjuryScenario_id 
INNER JOIN Media  ON Media2InjuryScenario.Media_id = Media.Media_id 
ORDER BY InjuryScenario.TimeStamp DESC

【讨论】:

    猜你喜欢
    • 2016-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-29
    • 2013-12-22
    • 1970-01-01
    • 2019-01-19
    • 1970-01-01
    相关资源
    最近更新 更多