2017-02-22 58 views
0

我试图通过我自己解决这个问题,但我找不到任何解决方案,所以也许你可以提供帮助。我有以下查询:当选择SQL查询时双重结果

select users.name,users.userid,position,department.name,num,phone.pname,objpict.fname 
from users 
inner join opict on opict.ownerid=users.id 
inner join department on department.id=users.deptid 
inner join phone on phone.ownerid=users.id 
where quitted=0 and tag='web' and opict.del=0 and phone.del=0 and phone.ownertype=5 

它的工作很好,但问题是,有些用户有2个或3个不同势nummbers所以选择resoult将是:

Name  UserID Number 
------ ------ -------- 
David Test  12345678 
David Test  11111111 

所以问题是,输出将是双。我该如何解决,这将是这样的格式:

Name  UserID Number 
------ ------ -------- 
David Test  12345678 
     Test  11111111 
+7

在您的应用程序代码中执行此操作。 SQL不适合做这种操作。 – GurV

+0

您最好采取另一种方法,以便每个用户有1行,每个电话号码有1个列,而不是每个用户有多行。只有当您拥有最大限量的电话号码时(2-3听起来不错),这才能起作用。 [示例这里](http://stackoverflow.com/questions/10196237/sql-select-phone-numbers-from-a-many-to-many-table-with-different-types-mobile) –

回答

2

如果你不想显示重复值,您可以用CASE声明一起使用ROW_NUMBER()

select case 
      when row_number() over (partition by users.userId order by users.userId) = 1 
       then users.name 
      else NULL 
     end as userName 
    , users.userid 
    , position 
    , department.name 
    , num 
    , phone.pname 
    , objpict.fname 
from users 
inner join opict 
    on opict.ownerid = users.id 
inner join department 
    on department.id = users.deptid 
inner join phone 
    on phone.ownerid = users.id 
where quitted = 0 
    and tag = 'web' 
    and opict.del = 0 
    and phone.del = 0 
    and phone.ownertype = 5 

如果您不想要NULL显示,并且想要一个“空白区域”,您可以将CASE语句的第二个分支更改为else ''

+0

谢谢:)我不得不添加更多的“案例”,但它的工作:)谢谢你的帮助。 –