0

テスト用に多数のテーブルにデータを入力することを検討しています。タイムスタンプ列を除いて、データはすべて同じにすることができます。行の他の列には、xml形式のオブジェクトやその他の厄介なものなどの複雑なデータが含まれているため、再作成する必要はありません。SQLクエリを使用してタイムスタンプを一定の間隔でインクリメントすることにより、単一のエントリを数千に拡張する簡単な方法は何でしょうか。

私たちの現在のアイデア(C風の擬似コード)は次のとおりです。

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を使用しています

4

3 に答える 3

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 用です。DATEADD 関数は、RDBMS によって異なる場合があります。間隔を正確に 1 分にしたくない場合は、ランダム関数を追加することもできます。もちろん、間隔を時間、日などに変更することもできます。インターバルごとに 2 時間と言う場合は、単純な方程式を使用することもできます。

于 2009-12-09T18:37:04.667 に答える
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
于 2009-12-09T18:39:43.560 に答える
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
于 2009-12-09T18:44:51.513 に答える