SQL Query Distinct关键字问题

时间:2011-10-15 12:54:55

标签: sql sql-server-2005 distinct

执行连接查询时,我收到重复数据而不是“distinct”关键字。我昏昏欲睡谷歌并没有获得任何收益。表名是“Event”,它包含事件列表,另一个表是UserEvents,用于向用户分配通风口。可以将事件分配给多个用户。我正在使用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

问题:

此处,事件重复而不是不同的关键字。它不应该重复事件'e1'。 请帮助我。我如何更改查询?这是SQL Server 2005中的一个问题吗? 亲切的帮助

4 个答案:

答案 0 :(得分:2)

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

没有一行是相同的。

答案 1 :(得分:1)

请澄清你的问题,你想看到什么结果。您的第一个查询返回了区分结果,您可以在此处查看SE数据资源管理器 http://data.stackexchange.com/stackoverflow/qt/115261 来自MSDN:DISTINCT 指定结果集中只能显示唯一的行。

答案 2 :(得分:0)

如果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

答案 3 :(得分:0)

  

不应重复事件'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数据上试用:http://data.stackexchange.com/stackoverflow/q/115257/