首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何为sqlite3中的3列合并具有相同值的行(每列为X列),并以特定的列vlaue作为合并的前提?

问如何为sqlite3中的3列合并具有相同值的行(每列为X列),并以特定的列vlaue作为合并的前提?
EN

Stack Overflow用户
提问于 2017-07-20 05:29:50
回答 1查看 313关注 0票数 0

我有一个sqlite3(通过python3进行交互) db表(名为"T"),它看起来像-

代码语言:javascript
复制
ID(PK)  A            B    ....  M  ....  N .....   P ..... X
_____________________________________________________________

 1  "string1"   "tom"       "Jim"    "Subway"   NULL    "Mr.Sub"
 2  "string2"   "tom"       "Jim"    "Hungry"   NULL    "Mr.Sub"
 3  "string3"   "tom"       "Jim"     NULL     "XBOX"   "Mr.Sub"
 4  "string1"   "Pam"       "Dave"    NULL     "GOLF"  "Starbucks"
 5  "string2"   "Pam"       "Dave"   "Arbys"    NULL   "Starbucks"
 6  "string1"   "Kyle"      "Ron"     NULL      NULL    "Gamers"
 7  "string4"   "Kyle"      "Ron"     NULL     "CART"   "Gamers"

我想对它做以下操作-

  1. 查找列B、M和X的所有唯一组合。
  2. 对于每个这样的组合,找出对应的行数。
  3. 如果每这样的B、M和X组合有超过1行,请通过以下步骤将它们合并成一行。
  4. 在这些行中,如果其他列(N、P等)的值存在冲突,则从具有A="string1“的行中选择列的值。如果A为NULL,则与任何其他非空值一起使用。如果所有值都为NULL,则使用NULL。

对于上面的例子,结果表应该类似于-

代码语言:javascript
复制
ID(PK)  A            B    ....  M  ....  N ..... P ....   X
____________________________________________________________

 1  "string1"   "tom"       "Jim"    "Subway"  "XBOX"   "Mr.Sub"
 4  "string1"   "Pam"       "Dave"   "Arbys"   "GOLF"   "Starbucks"
 6  "string1"   "Kyle"      "Ron"     NULL     "CART"   "Gamers"

我能想出的解决办法是:

代码语言:javascript
复制
update a
set a.N = coalesce(a.N, b.N)
set a.P = coalesce(a.P, b.P)
from T a inner join T b
on a.B = b.B and a.M = b.M and a.X = b.X

这是基于在博客文章这里中给出的mysql示例。但是,这在sqlite3中不起作用,并且缺乏基于A列值的优先级。有人能共享在sqlite3中工作的正确查询吗?

EN

回答 1

Stack Overflow用户

发布于 2017-07-20 13:26:45

合并操作可以描述如下:

  1. 对于每个string1行,如果N或P值为空,则从同一string1组中具有非空值的其他行中提取它们。
  2. 删除所有其他stringX行。
代码语言:javascript
复制
UPDATE T
SET N = (SELECT N
         FROM T AS T2
         WHERE T2.B = T.B
           AND T2.M = T.M
           AND T2.X = T.X
           AND T2.N IS NOT NULL)
WHERE A = 'string1'
  AND N IS NULL;

UPDATE ...   -- same for P

DELETE FROM T
WHERE A <> 'string1';
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45205899

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档