2011-10-15 44 views
0

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

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 kinly帮助

+0

你的输出不是你真正得到的。 “uid”列中的值是什么?我猜想每个行的值都是相同的'eid',所以你的区别在工作。 –

+0

@XXXcoder - 你低估了我的答案的任何特定原因?它为您的示例数据提供了完全准确的结果,而不是您问题中编写的结果(您的最后一行不正确),并解释了为什么您对“DISTINCT”的理解不正确。 –

+0

@MartinSmith,你的输出是我的isse。我不希望事件重复。请仔细阅读我的问题。 –

回答

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 

没有一行是相同的。

+0

”没有一行是相同的。“你疯了吗?这是问题。我不想重复e1。 –

+0

@XXXcoder:马丁绝对正确,没有一行是相同的。这是不同关键字必须返回的方式 - 所有选定字段的唯一集合。你的第一个样本有不正确的结果,它必须是一个错字。请仔细阅读http://msdn.microsoft.com/en-us/library/aa259187(v=sql.80).aspx。没有什么个人的,好吗? – brainboost

+0

错了,我不想要那个结果。我不想让“e1”重复。 –

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 
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/

+0

因为我在SE上回答问题的唯一原因是学习,我真的很感谢评论投票,所以下次我可以给出更好的答案。 –