8

我正在看这个问题: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

Anne其中后者中的和记录的计数与前一组记录Joe中的相应count值相匹配。

可以用 SQL 完成吗?如果是这样,怎么做?

编辑:

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

另一个编辑:

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

4

3 回答 3

9

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

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列中的值是无界的,那么只有迭代或递归解决方案(如其他两个答案)可以工作。

于 2012-04-09T08:57:20.500 回答
6

什么 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
于 2012-04-09T08:48:56.627 回答
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 只是用于测试的源数据。

于 2012-04-09T08:47:51.167 回答