【问题标题】:SQL Query Distinct keyword issueSQL Query Distinct 关键字问题
【发布时间】:2011-10-15 12:54:55
【问题描述】:

在执行连接查询时,我得到了重复的数据,而不是“distinct”关键字。我调暗了更多的谷歌,却一无所获。表名是“Event”,其中包含事件列表,另一个表是 UserEvents,它向用户分配通风口。 On 事件可以分配给多个用户。我使用的是 SQL Server 2005。

Events
eid | ename
-----------------
e1  | Test event1
e2  | test ecent2

UserEvents
id| uid |  eventId
-----------------
1 | u1  |  e1
2 | u1  |  e2
3 | u2  |  e1

查询:

select distinct 
Events.eid, Events.ename,UserVents.uid  
  from
      Events
  inner join
      UserEvents on
      UserEvents.eventID=Events.eid

输出:

eid | ename       | uid
-------------------
e1  | Test event1 | u1
e2  | Test event2 | u2
e1  | test event1 | u1

问题:

在这里,Event 是重复的,而不是不同的关键字。它不应该重复事件“e1”。 请帮助我。我如何更改查询?这是 SQL Server 2005 中的问题吗? 请帮忙

【问题讨论】:

  • 你的输出不是你真正得到的。 uid 列中有哪些值?我猜每个具有相同 eid 的行的值都不同,所以你的 distinct 正在工作。
  • @XXXcoder - 你有什么特别的理由拒绝我的回答吗?它为您的示例数据提供了完全准确的结果,而不是您问题中的虚构数据(您的最后一行不正确),并解释了为什么您对 DISTINCT 的理解不正确。
  • @MartinSmith,你的输出是我的问题。我不希望事件重演。请仔细阅读我的问题。
  • 输出有u2e2在同一行是错字吗?加入eid 不会给出这样的结果。此外,您对给定数据的预期输出是什么。
  • @XXXcoder - 我确实读过你的问题。您询问您得到的结果是否是“SQL Server 2005 中的问题”。答案是“否”DISTINCT isn't broken 它正在返回它应该返回的内容。您还没有解释 - 假设有多个可能的 uid 值可以针对您想要选择的特定 Events.eid, Events.ename 返回。

标签: sql sql-server-2005 distinct


【解决方案1】:

DISTINCT 适用于整个列列表。整行需要相同才能被淘汰。

您在问题中输入的结果不完整,因为您错过了uid 列。

WITH Events(eid,ename) AS(
SELECT 'e1' ,'Test event1' UNION ALL
SELECT 'e2' ,'test ecent2')

,UserEvents(id,uid,eventId) AS
(
SELECT 1,'u1' , 'e1' UNION ALL
SELECT 2,'u1' , 'e2' UNION ALL
SELECT 3,'u2' , 'e1'
)
select distinct 
        Events.eid, Events.ename,UserEvents.uid  
        from
        Events
        inner join
        UserEvents on
        UserEvents.eventId=Events.eid

返回

eid  ename       uid
---- ----------- ----
e1   Test event1 u1
e1   Test event1 u2
e2   test ecent2 u1

所有行都不相同。

【讨论】:

  • "所有行都不相同。"你疯了吗?这就是问题所在。我不想重复 e1。
  • @XXXcoder:马丁绝对正确,没有一行是相同的。这就是 distinct 关键字必须返回的方式——所有选定字段的唯一集。您的第一个样本结果不正确,一定是错字。请仔细阅读msdn.microsoft.com/en-us/library/aa259187(v=sql.80).aspx。没有什么私人的,好吗?
  • 错了,我不想要那个结果。我不想重复“e1”。
  • @XXXcoder - 不要再告诉我们你不想要什么,而是解释你做什么想要什么。虽然我不在乎我的参与,但您未来的任何问题都已完成。
【解决方案2】:

请澄清您的问题,您希望看到什么结果。您的第一个查询返回了不同的结果,您可以在此处在 SE 数据浏览器上查看 https://data.stackexchange.com/stackoverflow/qt/115261 来自 MSDN:DISTINCT 指定结果集中只能出现唯一行。

【讨论】:

    【解决方案3】:

    如果 distinct 关键字不起作用,请尝试添加 group by 子句。 您的新查询应如下所示:

    select  
                Events.eid, Events.ename,UserVents.uid  
                from
                Events
                inner join
                UserEvents on
                UserEvents.eventID=Events.eid
    group by Events.eid, Events.ename,UserVents.uid
    

    【讨论】:

      【解决方案4】:

      它不应该重复事件'e1

      如何更改查询?

      这可能是您正在寻找的:

      select E.eid, 
             E.ename, 
             E.uid
      from (
            select Events.eid, 
                   Events.ename,
                   UserEvents.uid,
                   row_number() over(partition by eid 
                                     order by UserEvents.uid) as rn  
            from Events
              inner join UserEvents 
                on UserEvents.eventId=Events.eid
           ) as E
      where E.rn = 1 
      

      结果:

      eid  ename       uid
      ---- ----------- ----
      e1   Test event1 u1
      e2   test ecent2 u1    
      

      在 SE 数据上试用:https://data.stackexchange.com/stackoverflow/q/115257/

      【讨论】:

      • 因为我在 SE 上回答问题的唯一原因是为了了解我非常感谢您对否决票发表评论,以便下次我可以给出更好的答案。
      猜你喜欢
      • 1970-01-01
      • 2011-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多