1

我有这张叫做bag的桌子:

+--------+----------+---------+----------+
| bag_id | chara_id | item_id | item_qty |
+--------+----------+---------+----------+
|      1 |        1 |       2 |       22 |
|      2 |        1 |       1 |       55 |
|      3 |        3 |       1 |        2 |
|      6 |        3 |       4 |        2 |
|      7 |        4 |       4 |        2 |
|      8 |        5 |       4 |        2 |
|      9 |        6 |       4 |        2 |
|     10 |        1 |       5 |        1 |
|     11 |        1 |       2 |        1 |
|     12 |        1 |       2 |        1 |
|     13 |        1 |       2 |        1 |
|     14 |        1 |       8 |        1 |
|     15 |        1 |       6 |        1 |
|     16 |        1 |       8 |        1 |
|     17 |        1 |       6 |        1 |
+--------+----------+---------+----------+

关系变成 1 个字符 = 许多项目现在我不想要 1 个字符 = 许多重复的项目。

如何进行删除重复值的查询?像 chara_id: 1 有 3 个重复的 item_id: 2 我想删除另外 2 个。

4

2 回答 2

2

不是最好的方法。但以下应该绝对有效:

Delete from Bag 
where bag_id 
         not in (
                 select min(bag_id) from bag a, 
                    (select chara_id, item_id 
                        from bag group by chara_id, item_id 
                            having count(*) > 1) b 
                 where a.chara_id = b.chara_id and a.item_id = b.item_id 
                 UNION
                 select bag_id from bag a, 
                    (select chara_id, item_id 
                        from bag group by chara_id, item_id 
                            having count(*) = 1) b 
                 where a.chara_id = b.chara_id and a.item_id = b.item_id
         ) 
于 2013-05-03T02:58:13.977 回答
1

您可以简单地使用子查询连接表,该子查询为和的每个组合bag获取最小值。在子查询的任何字段上具有空值的记录是将被删除的记录。bag_idchara_IDitem_ID

DELETE  a
FROM    bag a
        LEFT JOIN
        (
            SELECT  chara_ID, item_ID, MIN(bag_ID) min_ID
            FROM    bag
            GROUP   BY chara_ID, item_ID
        ) b ON  a.bag_ID = b.min_ID AND
                a.chara_ID = b.chara_ID AND
                a.item_ID = b.item_ID
WHERE   b.min_ID IS NULL
于 2013-05-03T03:15:16.787 回答