从单个条目通过SQL查询填充数据库的简单方法是什么?

时间:2009-12-09 18:27:48

标签: sql populate

我们希望填充一些表格进行测试。除时间戳列外,数据都可以相同。该行中的其他列包含复杂的数据,如xml格式的对象和其他杂乱的东西,因此我们不想重新制作它。 通过SQL查询以一个恒定的间隔递增时间戳,将单个条目扩展为数千个条目的简单方法。

我们当前的想法(在C-ish伪代码中)是:

Get the latest (likely only) row and store it in a variable "thisRow"
While(thisRow->time < endTime)
{
Increment thisRow->time by a constant variable
Insert thisRow
}

我们正在使用postgres

3 个答案:

答案 0 :(得分:2)

我喜欢在我的数据库中保留一个Numbers表来查询某些查询。如果您有一个,那么您可以使用下面的单个声明。如果你没有,那么很容易生成一个作为临时表或永久表。

INSERT INTO Test_Table
(
     col1,
     col2,
     ...,
     my_timestamp
)
SELECT
     ST.col1,
     ST.col2,
     ...,
     DATEADD(mi, N.number, ST.my_timestamp)
FROM
     Source_Table ST
INNER JOIN Numbers N ON
     N.number BETWEEN 1 AND 1000  -- Change this to what you want

这适用于SQL Server。您的RDBMS中的DATEADD函数可能有所不同。如果您不希望间隔恰好是一分钟,您也可以添加随机函数,当然您可以将间隔更改为小时,天或其他任何内容。如果你想要每个间隔说两个小时,你也可以使用一个简单的等式。

答案 1 :(得分:2)

使用SQL SERVER 2005+,您可以使用CTE语句

看看这个

DECLARE @StartTime DATETIME,
        @EndTime DATETIME

SELECT  @StartTime = '01 Jan 2009',
        @EndTime = '31 Jan 2009'

DECLARE @Table TABLE(
        DateVal DATETIME,
        Col1 INT
)

INSERT INTO @Table SELECT @StartTime, 1

SELECT  *
FROM    @Table

;WITH CTE AS (
        SELECT @StartTime StartTime
        UNION ALL
        SELECT  DATEADD(dd, 1, StartTime) StartTime
        FROM    CTE 
        WHERE   StartTime < @EndTime
)
SELECT  CTE.*,
        t.Col1
FROM    CTE,
        @Table t

答案 2 :(得分:1)

如果您使用的是支持递归的数据库,例如Microsoft SQL Server,则可以使用以下内容:

WITH T AS (
    SELECT 1 AS r
    UNION ALL
    SELECT r + 1 AS r
    FROM T
    WHERE r < 100 -- Or however many rows you need
)
INSERT INTO TestTable (Col1, Col2,...)
SELECT s.Col1, s.Col2,...
FROM SourceTable s
    CROSS JOIN T