1

我有一个如下选择站,它返回 2 行:

select ID, Title from TableName

(实际的查询非常大并且返回更多的行,但为简单起见假设以上。)

我需要一个返回更多数据的查询,但我无法更改数据库表。

如何乘以/复制并增加返回的行数,例如 5 倍,以便返回 10 行?

我知道 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 回答