SQL选择两个值相同的行,其方式是保留输出中的编辑功能

时间:2017-03-05 20:49:04

标签: mysql sql

道歉,如果答案显而易见,但是尽管进行了大量的研究并尝试了不同的命令,解决方案也让我失望了(我更多的是词典编纂者而不是开发者)。

我们有一个表格,由于各种原因最终导致一些行在关键单元格中具有重复值。样机看起来像这样:

Unique_ID   | E_ID   | Date       | User_ID    | V_value
1           | 500    | 2012-05-12 | 23         | 3
2           | 501    | 2012-05-12 | 23         | 3
3           | 501    | 2012-05-13 | 23         | 1
4           | 502    | 2012-05-13 | 23         | 2
5           | 503    | 2012-05-12 | 23         | 2
6           | 7721   | 2012-05-22 | 8845       | 3
7           | 7722   | 2012-05-22 | 8845       | 3
8           | 7722   | 2012-05-22 | 8845       | 3
9           | 7723   | 2012-05-22 | 8845       | 3

因此我需要输出的行是Unique_ID 2& 3和7&因为它们在E_ID和User_ID字段方面是相同的。其他字段的值与我们的问题无关。所以我想要的是理想的:

Unique_ID   | E_ID   | Date       | User_ID    | V_value
2           | 501    | 2012-05-12 | 23         | 3
3           | 501    | 2012-05-13 | 23         | 1
7           | 7722   | 2012-05-22 | 8845       | 3
8           | 7722   | 2012-05-22 | 8845       | 3

由于与数据有关的原因,我需要输出显示编辑功能(特别是勾选框或至少删除功能),因为我需要手动浏览表格并丢弃其中一个或另一个根据无法使用SQL命令确定的决策/条件进行复制。

我最接近的是:

SELECT *
FROM ( SELECT E_ID, User_ID, COUNT(Unique_ID)
AS V_Count
FROM TableName
GROUP BY E_ID, User_ID
ORDER BY E_ID )
AS X
WHERE V_Count > 1
ORDER BY User_ID ASC, E_ID ASC

它确实给了我带有重复的行,但是因为我创建了V_Count列来给我重复项:

E_ID   | User_ID    | V_Count
501    | 23         | 2
7722   | 8845       | 2

输出没有给我我需要的删除选项 - 它说它是因为没有唯一的ID而我得到了它,因为它将它们放在同一行中。有没有办法在不丢失Unique_ID的情况下执行此操作,因此我不会丢失删除功能?

2 个答案:

答案 0 :(得分:0)

一种简单的方法使用public static double GetDistance(int x0, int y0, int x1, int y1) { int dX = y1 - y0; int dY = x1 - x0; return Math.Sqrt(dX * dX + dY * dY); }

exists

将每个组合放在包含所有ID的单行上的另一种方法是:

select t.*
from tablename t
where exists (select 1
              from tablename t2
              where t2.e_id = t.e_id and t2.date = t.date and
                    t2.user_id = t.user_id and t2.v_value = t.v_value and
                    t2.unique_id <> t.unique_id
             );

答案 1 :(得分:0)

如果有多行,您可以使用聚合来检查给定的user_id和e_id。然后将其与您的表连接以获取结果中的所有列。

select t1.*
from tablename t1
join (
    select e_id,
        user_id
    from tablename
    group by e_id,
        user_id
    having count(*) > 1
    ) t2
    on t1.e_id = t2.e_id
        and t1.user_id = t2.user_id

使用USING子句可以更清晰地表达:

select *
from tablename t1
join (
    select e_id,
        user_id
    from tablename
    group by e_id,
        user_id
    having count(*) > 1
    ) t2 using (e_id, user_id)