如何排除有重复的行(删除)

cclgggtu  于 2021-06-17  发布在  Mysql
关注(0)|答案(2)|浏览(348)

有人可以帮我执行一个查询,删除查询中重复的元素

Select * from table where APPNAME = 'Ap1' or APPNAME= 'Ap2'

使用distinct的结果

id | APPNAME| USERNAME|
1      Ap1      User1     
2      Ap2      User1    
3      Ap1      User3
4      Ap2      User4
5      Ap1      User5 
6      Ap1      User6 
7      Ap2      User6

在这个表中,用户1和6都有这两个应用程序。必须从查询中删除这两个用户。
预期结果是

id | APPNAME| USERNAME|    
1     Ap1      User3
2     Ap2      User4
3     Ap1      User5

如果我使用distinct,那么它消除了一个重复,我需要同时消除它们。
使用distinct的结果

id | APPNAME| USERNAME|
1      Ap1      User1       
2      Ap1      User3
3      Ap2      User4
4      Ap1      User5 
5      Ap2      User6

谢谢

u3r8eeie

u3r8eeie1#

这似乎应该是可行的,除非有语法问题(很可能是 AS 关键字)来阻止它在mysql中工作:

SELECT *
  FROM table AS t
 WHERE (t.appname = 'Ap1' OR t.appname = 'Ap2')
   AND t.username NOT IN
       (SELECT u.username
          FROM table AS u
         WHERE (u.appname = 'Ap1' OR u.appname = 'Ap2')
         GROUP BY u.username
        HAVING COUNT(*) > 1
       )

子查询列出具有列表中多个条目的用户名 Ap1 以及 Ap2 ,并且not-in从主查询结果中排除这些。请注意,子查询对应用相同的筛选器 appname 作为主查询以确保一致性。否则,你可能会忽略那些 Ap1 以及 Ap3 ,但它们应该包括在内,因为它们只有一个 Ap1 以及 Ap2 .
这种子查询方法在除mysql以外的大多数sqldbms中都是必需的,而且也应该适用于mysql。可能也有使用olap窗口功能的技术。然而,mysql对于select列表和GROUPBY子句中允许/要求的内容也有不同的规则-标准sql要求出现在select列表中的非聚合列在GROUPBY子句中列出,大多数sql dbms都遵循这一规则。据我所知,mysql没有,这可能会允许其他(更简单的)公式-但它们不一定在其他dbms中工作(这可能对您来说很重要,也可能不重要)。
表别名(随 AS 关键字)不是100%必需的;查询在没有它们的情况下可以正常工作(删除 AS [tu] 子句,并删除 t. 以及 u. 前缀)。在另一个sql dbms(informix 12.10)上进行测试,这是可行的(verbatim-informix允许使用大多数关键字作为对象名,而不需要将它们视为用双引号括起来的分隔标识符):

DROP TABLE IF EXISTS table;

CREATE TABLE table
(
    id          INTEGER NOT NULL PRIMARY KEY,
    appname     VARCHAR(10) NOT NULL,
    username    VARCHAR(10) NOT NULL
);

INSERT INTO table VALUES(1, 'Ap1', 'User1');
INSERT INTO table VALUES(2, 'Ap2', 'User1');
INSERT INTO table VALUES(3, 'Ap1', 'User3');
INSERT INTO table VALUES(4, 'Ap2', 'User4');
INSERT INTO table VALUES(5, 'Ap1', 'User5');
INSERT INTO table VALUES(6, 'Ap1', 'User6');
INSERT INTO table VALUES(7, 'Ap2', 'User6');

SELECT *
  FROM table
 WHERE (appname = 'Ap1' OR appname = 'Ap2')
   AND username NOT IN
       (SELECT username
          FROM table
         WHERE (appname = 'Ap1' OR appname = 'Ap2')
         GROUP BY username
        HAVING COUNT(*) > 1
       );

输出为:

3   Ap1   User3
4   Ap2   User4
5   Ap1   User5

注意我正在治疗 ID 列作为物理列,从而从原始数据集中选择值。如果它不是一个物理列,不要在问题中显示它,或者显示它是如何生成的。

nc1teljy

nc1teljy2#

select distinct * from table where APPNAME = 'Ap1' or APPNAME= 'Ap2' group by APPNAME having (count(APPNAME)=1);

相关问题