1

以下のように、2 行を返す選択ステーションがあります。

select ID, Title from TableName

(実際のクエリは非常に大きく、より多くの行を返しますが、簡単にするために上記を想定しています。)

より多くのデータを返すクエリが必要ですが、データベース テーブルを変更できません。

代わりに 10 行が返されるように、返される行数を乗算/複製して、たとえば 5 倍に増やすにはどうすればよいですか?

UNION ALL を使用すると、5回書くと可能になることがわかっています。

select ID, Title from TableName
UNION ALL
select ID, Title from TableName
UNION ALL
select ID, Title from TableName
UNION ALL
select ID, Title from TableName
UNION ALL
select ID, Title from TableName

しかし、他にもっと簡単な方法はありますか?私の実際のクエリははるかに大きいため、UNION ALL を使用できません。

質問が明確であることを願っています。

4

1 に答える 1

2
DECLARE @i INT;

SET @i = 1000;

;WITH n AS (SELECT TOP (@i) object_id FROM sys.all_columns)
SELECT t.ID, t.Title FROM TableName AS t CROSS JOIN n;

CTE で十分な行が提供されないことがわかった場合は、いつでも追加できます。

DECLARE @i INT;

SET @i = 1000000;

;WITH n AS 
(
  SELECT TOP (@i) c.object_id FROM sys.all_columns AS c
   CROSS JOIN sys.all_objects AS o
)
SELECT t.ID, t.Title FROM TableName AS t CROSS JOIN n;

...または独自の Numbers テーブルを作成することもできます:

SET NOCOUNT ON;

DECLARE @UpperLimit INT = 1000000; -- customize this

;WITH n AS
(
    SELECT
        x = ROW_NUMBER() OVER (ORDER BY s1.[object_id])
    FROM       sys.all_objects AS s1
    CROSS JOIN sys.all_objects AS s2
    CROSS JOIN sys.all_objects AS s3
)
SELECT Number = x
  INTO dbo.Numbers
  FROM n
  WHERE x BETWEEN 1 AND @UpperLimit;

GO
CREATE UNIQUE CLUSTERED INDEX n ON dbo.Numbers(Number)
  -- if Enterprise Edition:
  -- WITH (DATA_COMPRESSION = PAGE)
;

これで、クエリは次のようになります。

DECLARE @i INT;

SET @i = 1000000;

;WITH n AS (SELECT TOP (@i) Number FROM dbo.Numbers)
SELECT t.ID, t.Title FROM TableName AS t CROSS JOIN n;
于 2012-06-06T14:25:25.797 に答える