gpt4 book ai didi

Sqlite:基于非主键字段创建具有重复行的表

转载 作者:行者123 更新时间:2023-12-03 18:44:30 26 4
gpt4 key购买 nike

我有一个 sqllite 表;

CREATE TABLE tmp2(
id INT,
account TEXT,
name TEXT,
)

我的表(表 tmp2)看起来像:
 id  , account  , name

1 A1 bob
2 A2 dave,john,sally
3 A3 tom

我需要创建一个新表(表 B),以便只有 1 个名称/行:
 id  , account  , name

1 A1 bob
2 A2 dave
2 A2 john
2 A2 sally
3 A3 tom

复制所有其他字段。鉴于主键不能重复,这可能使用 sql 吗?还使用 sql 如何访问 "dave, john, sally"中的个人姓名?

最佳答案

这是一个 SQLite 解决方案(基于 MCVE,如本答案末尾所示)。

  • 做一个递归公用表表达式,with singles(id, account, first, rest) as
  • 来自 UNION ALL
  • id、帐号和
  • 最初
  • tmp2 列表中的名字,substr(name, 0, instr(name||', ', ', '))
  • tmp2 中的列表的其余部分,substr(name, instr(name||', ', ', ')+2)
  • 递归地
  • 几乎相同,但来自 CTE 单曲
  • 从该 CTE 中只需选择 ID、帐户和名字,select id, account, first from singles
  • 按 id 排序并使用特殊分隔符来匹配所需的输出,order by id , .separator ' '
  • 先附加 ', ' 的小技巧;这使得一切都成为重复 1-N 次的单一模式

  • 代码:
    with singles(id, account, first, rest) as 
    ( select id,
    account,
    substr(name, 0, instr(name||', ', ', ')),
    substr(name, instr(name||', ', ', ')+2)
    from tmp2
    UNION
    select id,
    account,
    substr(rest, 0, instr(rest||', ', ', ')),
    substr(rest, instr(rest||', ', ', ')+2)
    from singles where rest!=''
    )
    select id, account, first
    from singles
    order by id;

    输出(带有 .separator ' ' ):
    1   A1   Bob
    2 A2 dave
    2 A2 john
    2 A2 sally
    3 A3 tom

    MCVE(对不起,小写首字母错别字...):
    BEGIN TRANSACTION;
    CREATE TABLE tmp2(
    id INT,
    account TEXT,
    name TEXT);
    INSERT INTO tmp2 VALUES(1,'A1','Bob');
    INSERT INTO tmp2 VALUES(2,'A2','dave, john, sally');
    INSERT INTO tmp2 VALUES(3,'A3','tom');
    COMMIT;

    在 Windows 10 上使用 SQLite 3.18.0 2017-03-28 18:48:43

    如果您对使用 SQLite 的递归 CTE 感兴趣,我推荐这个,这是我对它们的知识来源:
    https://sqlite.org/lang_with.html

    顺便说一句,我同意 Joey Pinto 的观点,使用一个像样的数据库结构会更好......

    关于Sqlite:基于非主键字段创建具有重复行的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45195831/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com