在SQLite 3中合并行

在SQLite 3中合并行,sqlite,merge,Sqlite,Merge,我有以下SQLite 3表模式: CREATE TABLE rolestats (player TEXT, role TEXT, teamwins SMALLINT, individualwins SMALLINT, totalgames SMALLINT, UNIQUE(player, role)); 一些样本数据: sqlite>SELECT*从rolestats中,像“%rika%”这样的玩家限制10; 里卡|杰斯特| 0 | 3 | 4 丽卡|守护天使| 0 | 0 | 1 丽卡|克隆

我有以下SQLite 3表模式:

CREATE TABLE rolestats (player TEXT, role TEXT, teamwins SMALLINT, individualwins SMALLINT, totalgames SMALLINT, UNIQUE(player, role));
一些样本数据:

sqlite>SELECT*从rolestats中,像“%rika%”这样的玩家限制10;
里卡|杰斯特| 0 | 3 | 4
丽卡|守护天使| 0 | 0 | 1
丽卡|克隆| 0 | 1 | 1
里卡|村长者| 1 | 0 | 1
里卡|乡村醉酒| 7 | 5 | 10
里卡|崇拜者| 5 | 0 | 15
丽卡|侦探| 3 | 2 | 4
里卡|狼崽| 7 | 3 | 11
里卡|沃尔夫| 0 | 0 | 1
里卡|萨满| 2 | 1 | 2
正如您所看到的,名称有不同的大写形式。它使用IRC帐户名,但可以更改。在某些情况下,它们的区别也不仅仅是在具体情况上。对于这个特殊的案例,案例不敏感是有计划的,但我们还没有

以下是我的想法:

SELECT role, SUM(teamwins), SUM(individualwins), SUM(totalgames) FROM rolestats WHERE player LIKE "%rika%" GROUP BY role;

我以前已经这样做过一次,但现在我不知道如何将此查询的结果插入到
player=“rika”
中,并删除其他玩家名称变体。

在对名称中包含的常见模式进行评论后,这应该会有所帮助:

INSERT OR REPLACE INTO rolestats
SELECT  'rika',
        role, 
        SUM(teamwins) as teamwins, 
        SUM(individualwins) as individualwins, 
        SUM(totalgames) as totalgames
FROM rolestats WHERE player LIKE '%rika%' group by role;

DELETE FROM rolestats WHERE player != 'rika' AND player LIKE '%rika%';
我不确定您的方法是否正确,这意味着如果您有像“MoreRika”和“rika”这样的用户名,它们都将被汇总到您的统计数据中(因为“%”)

我认为您希望在转换之前规范化用户名(例如,将其转换为小写或大写)。不幸的是,SQLite不支持使用子查询进行更新,但是可以使用
REPLACE
作为替代方法

我认为你试图解决的问题可以这样解决:

-- we convert all non-normalized names to their normalized format
INSERT OR REPLACE INTO rolestats
SELECT  LOWER(player),
        role, 
        SUM(teamwins) as teamwins, 
        SUM(individualwins) as individualwins, 
        SUM(totalgames) as totalgames
FROM rolestats group by LOWER(player), role;

-- now we can delete all non-normalized player names
DELETE from rolestats WHERE player NOT IN (
  SELECT LOWER(rs.player) FROM rolestats rs
);
查看此SQL小提琴:

请注意,此单一查询将转换所有用户,如果您只想转换特定用户,则必须添加WHERE子句:

INSERT OR REPLACE INTO rolestats
SELECT  LOWER(player),
        role, 
        SUM(teamwins) as teamwins, 
        SUM(individualwins) as individualwins, 
        SUM(totalgames) as totalgames
FROM rolestats WHERE LOWER(player) = 'rika' group by role;

DELETE from rolestats WHERE LOWER(player) = 'rika' AND player != 'rika';

类似于下面的SQL Fiddle:

你说得对,但在其他情况下,名称共享一个共同模式(例如,以
119
结尾)。我总是手动检查,以确保我没有合并其他人的统计数据。无论如何,谢谢!我会在我允许的时候(17小时内)给你赏金。@nyuszika7h谢谢,顺便说一句,如果你是手动的,我会发布第二个更新的查询。我认为在这种情况下,您必须选择新的通用名称(结果将合并到其中的名称)。这基本上不就是
SELECT。。。从角色列表中,如“%119”的玩家按角色分组
从角色列表中删除,如“%119”和玩家!='Reaper119'
?@nyuszika7h它是插入替换,它将更新行。请查看以下内容:。我的意思是,如果你只选择,旧的行将不受影响,然后你会失去你的数据删除。