【问题标题】:How can SQL create duplicate records?SQL如何创建重复记录?
【发布时间】:2012-04-09 08:40:37
【问题描述】:

我正在查看这个问题:Getting random value from a SQLite table,这让我想知道是否可以使用 SQL 复制记录。更具体地说,是否有允许转换这些记录的构造:

id| name| count
---------------
 1| Anne|     3
 2|  Joe|     2

进入:

id| name
--------
 1| Anne
 1| Anne
 1| Anne
 2|  Joe
 2|  Joe

其中AnneJoe 记录在后者中的计数与前一组记录中对应的count 值匹配。

可以用 SQL 完成吗?如果有,怎么做?

编辑:

Lucero 询问什么 SQL 方言;任何真的,但理想情况下,最不可知论的方法将是最好的。

另一个编辑:

可以在 say sqlite 中的单个 SQL 语句中完成吗?

【问题讨论】:

  • 简短的回答是是的,可以做到 :)
  • 阿瑞特,我更新了我的问题 ;-)
  • 您为什么要这样做?您将如何处理生成的数据集?
  • @RoryHunter:我很好奇,仅此而已;)不,我真的在考虑如何从结果集中随机选择
  • '为什么?' - 一些快速的性能测试是原因之一。获取您的结果集,将其提高 10x..100x.. 以查看您的 JDBC 驱动程序和客户端代码如何处理该卷。

标签: sql


【解决方案1】:

您可以使用“数字”表(对各种操作都很方便):

CREATE TABLE num
( i UNSIGNED INT NOT NULL
, PRIMARY KEY (i)
) ;

INSERT INTO num (i)
VALUES
  (1), (2), ..., (1000000) ;

然后:

SELECT 
    t.id, t.name
FROM 
        tableX AS t
    JOIN
        num
            ON num.i <= t."count"

警告:这种方法当然有局限性。只要 count 列中的值超过 Numbers 表中存储的最大值,查询就不会生成所有需要的行。如果count 列中的值是无限的,那么只有迭代或递归解决方案(如其他两个答案)可以工作。

【讨论】:

  • 很高兴加入 numi&lt;=count 的所有记录
【解决方案2】:

什么 SQL 方言和版本?它可以通过递归 CTE 轻松完成。

WITH cte AS (
    SELECT id, name, count FROM tbl
    UNION ALL
    SELECT id, name, count-1 FROM cte WHERE count>1
)
SELECT id, name FROM cte

【讨论】:

    【解决方案3】:

    这可以使用递归 CTE 来完成:

    ;WITH CTE_Data as (
        select id=1, name='Anne',[COUNT]=3
        union select id=2, name='Joe',[COUNT]=2
    ),
    CTE_List as (
        select
            id,
            name,
            ind=1
        from CTE_Data
        union all
        select
            l.id,
            l.name,
            ind=ind+1
        from CTE_List l
            join CTE_Data d on l.id = d.id
        where 
            l.ind < d.[count]
    )
    select id,name from CTE_List
    order by id,ind
    

    注意:CTE_List 很有趣,CTE_Data 只是用于测试的源数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-13
      • 2023-02-07
      • 2020-03-31
      • 2015-02-14
      • 1970-01-01
      相关资源
      最近更新 更多