选择 SQL 查询时出现双倍结果 [重复]

Posted

技术标签:

【中文标题】选择 SQL 查询时出现双倍结果 [重复]【英文标题】:Double results when select SQL query [duplicate] 【发布时间】:2017-02-22 09:04:42 【问题描述】:

我已尝试自行解决此问题,但找不到任何解决方案,因此也许您可以提供帮助。我有以下查询:

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 个不同的数字,因此选择结果将是:

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

所以问题是输出会加倍。我该如何解决它的格式如下:

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

【问题讨论】:

在您的应用程序代码中执行此操作。 SQL 不适合做这样的操作。 您最好采用另一种方法,以便每个用户有 1 行,每个电话号码有 1 列,而不是每个用户有几行。仅当您拥有最大和有限数量的电话号码(2-3 听起来不错)时,这才有效。 Example here 【参考方案1】:

如果您不想显示重复值,可以使用 ROW_NUMBER()CASE 语句:

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

【讨论】:

谢谢:) 我不得不添加更多“案例”,但它正在工作:) 谢谢大家的帮助。

以上是关于选择 SQL 查询时出现双倍结果 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

合并 Firestore 查询时出现重复数据

执行基本 SQL 语句时出现内部服务器错误 [重复]

更改函数列表时出现意外结果(lambda)[重复]

使用jsoup获取谷歌结果时出现403错误[重复]

在android中对SQLite Db执行查询时出现NullPointerException [重复]

在 SQL 中检测到重叠,未在选择中使用子查询且未将重复记录添加到结果集中