【问题标题】:How to select rows from a table multiply by n?如何从表中选择行乘以n?
【发布时间】:2012-06-10 13:59:53
【问题描述】:

我有一个如下选择站,它返回 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。

我希望问题很清楚。

【问题讨论】:

  • 为什么你需要每行返回 5 次?

标签: sql-server tsql select union


【解决方案1】:
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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-27
    • 2016-08-23
    • 2014-11-27
    • 2011-03-22
    • 1970-01-01
    • 1970-01-01
    • 2013-02-06
    • 1970-01-01
    相关资源
    最近更新 更多