【问题标题】:Remove duplicate row from SQL results从 SQL 结果中删除重复行
【发布时间】:2015-12-19 03:34:22
【问题描述】:

这是我从ORACLE DB 获取结果的 SQL 查询

SELECT U."UID", 
CONCAT(CONCAT(U.LNAME, ', '), U.FNAME) AS UNAME,
M.NAME,
(SELECT COUNT(LH."UID") FROM DRUPAL_SYS.LOGIN_HISTORY LH WHERE LH."UID"=U."UID" ) AS VIEWS_COUNT,
L.LOGIN as "ACCESS" FROM DRUPAL_SYS.USERS U INNER JOIN DRUPAL_SYS.LOGIN_HISTORY L ON L."UID" = U."UID"
INNER JOIN ABC_WEBAPP.MEMBER_USER_ROLE MUR ON MUR.USER_ID=U.MDES_ID AND MUR.MEMBER_ID LIKE '%' 
INNER JOIN ABC_WEBAPP.MEMBER M ON M.ID=MUR.MEMBER_ID WHERE U.LOGIN != 0 AND U."UID">1 ORDER BY L."LOGIN" ASC`

它给出的结果是重复的names

但我的预期结果应该是这样的

【问题讨论】:

  • 只需对结果进行分组。

标签: php sql oracle duplicate-removal


【解决方案1】:
SELECT U."UID", 
CONCAT(CONCAT(U.LNAME, ', '), U.FNAME) AS UNAME,
M.NAME,
(SELECT COUNT(LH."UID") FROM DRUPAL_SYS.LOGIN_HISTORY LH WHERE LH."UID"=U."UID" ) AS VIEWS_COUNT,
MAX(L.LOGIN) as "ACCESS" FROM DRUPAL_SYS.USERS U 
INNER JOIN DRUPAL_SYS.LOGIN_HISTORY L ON L."UID" = U."UID"
INNER JOIN ABC_WEBAPP.MEMBER_USER_ROLE MUR ON MUR.USER_ID=U.MDES_ID AND MUR.MEMBER_ID LIKE '%' 
INNER JOIN ABC_WEBAPP.MEMBER M ON M.ID=MUR.MEMBER_ID WHERE U.LOGIN != 0 AND U."UID">1
ORDER BY L."LOGIN" ASC`
GROUP BY UNAME, MNAME

L.LOGIN 更改为MAX(L.LOGIN) 并添加GROUP BY 子句

【讨论】:

    【解决方案2】:
    SELECT U."UID", 
    CONCAT(CONCAT(U.LNAME, ', '), U.FNAME) AS UNAME,
    M.NAME,
    (SELECT COUNT(LH."UID") FROM DRUPAL_SYS.LOGIN_HISTORY LH WHERE LH."UID"=U."UID" ) AS VIEWS_COUNT,
    L.LOGIN as "ACCESS" FROM DRUPAL_SYS.USERS U INNER JOIN DRUPAL_SYS.LOGIN_HISTORY L ON L."UID" = U."UID"
    INNER JOIN ABC_WEBAPP.MEMBER_USER_ROLE MUR ON MUR.USER_ID=U.MDES_ID AND MUR.MEMBER_ID LIKE '%' 
    INNER JOIN ABC_WEBAPP.MEMBER M ON M.ID=MUR.MEMBER_ID WHERE U.LOGIN != 0 AND U."UID">1 GROUP BY UNAME ORDER BY L."LOGIN" ASC`
    

    【讨论】:

    • ORA-00904:“UNAME”:标识符无效
    • 改成 U.LNAME ,U.FNAME
    • 试过了。但是得到 ORA-00979: not a GROUP BY 表达式。
    【解决方案3】:

    为了每个UIDUNAME 获得一个结果行,您需要按这些字段分组。

    GROUP BY UID, UNAME
    

    然后为所有剩余的字段决定显示哪个值。例如。你有四条记录“2689 kaila, piyush”,你想显示哪个名字?首先?最后?最大值? ...观看次数相同;最大值?总和?访问列也是同样的问题。

    例子:

    select uid, uname, max(name), max(views_count), max(access)
    from (<your query here>) query
    group by uid, uname;
    

    复制粘贴(删除了 ORDER BY 子句):

    select uid, uname, max(name), max(views_count), max(access)
    from 
    (
      SELECT U."UID", 
      CONCAT(CONCAT(U.LNAME, ', '), U.FNAME) AS UNAME,
      M.NAME,
      (SELECT COUNT(LH."UID") FROM DRUPAL_SYS.LOGIN_HISTORY LH WHERE LH."UID"=U."UID" ) AS VIEWS_COUNT,
      L.LOGIN as "ACCESS" FROM DRUPAL_SYS.USERS U INNER JOIN DRUPAL_SYS.LOGIN_HISTORY L ON L."UID" = U."UID"
      INNER JOIN ABC_WEBAPP.MEMBER_USER_ROLE MUR ON MUR.USER_ID=U.MDES_ID AND MUR.MEMBER_ID LIKE '%' 
      INNER JOIN ABC_WEBAPP.MEMBER M ON M.ID=MUR.MEMBER_ID WHERE U.LOGIN != 0 AND U."UID">1
    ) query
    group by uid, uname;
    

    【讨论】:

    • 完成。然而,这只是一个例子。 必须决定每个 UID 和 UNAME 显示哪些值。 (而且我很确定这个查询可以简化。这在很大程度上取决于应该显示哪些值。我只是展示了一种使用当前结果并从中获取每个 UID 和 UNAME 一行的方法。)
    • 感谢 Thorsten Kettner.. 但有一个错误 ORA-00936: 缺少表达式 00936. 00000 - “缺少表达式” 行错误:1 列:53
    猜你喜欢
    • 2021-07-13
    • 2021-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多