【问题标题】:MS SQL how to select n rows from table even if table has n - x rowsMS SQL如何从表中选择n行,即使表有n-x行
【发布时间】:2016-08-23 00:54:50
【问题描述】:

我有一个包含以下数据的表格:

ID | Name
---------
1  | John
2  | Alice

当我想选择 5 行时,我想获取下一个数据:

ID | Name
---------
1  | John
2  | Alice
1  | John
2  | Alice
1  | John

有什么想法可以做这个吗?

【问题讨论】:

  • 您可以将所有表与它自己联合起来,但是为什么要在 SQL 中这样做呢?我假设你得到数据然后你用代码处理它。没有理由从数据库中获取比您需要的更多的数据。您可以稍后在代码中显示或处理它。

标签: sql sql-server


【解决方案1】:

适用于n > 1 行:

;WITH cte AS (
SELECT *
FROM (VALUES
(1, 'John'),
(2, 'Alice')
) AS t(ID, Name)
)
,res AS (
    SELECT  id,
            name,
            ROW_NUMBER() OVER (partition by id ORDER BY ID) as pid
    FROM cte
    UNION ALL
    SELECT  c.id,
            c.name,
            pid + 1
    FROM res r
    INNER JOIN cte c 
        ON pid = c.id 
)

SELECT TOP 5 
        id,
        name
FROM res

输出:

id          name
----------- -----
1           John
2           Alice
1           John
2           Alice
1           John

(5 row(s) affected)

【讨论】:

    【解决方案2】:
    -- to create a sample table.
    CREATE TABLE table1 (ID BIGINT, NAME VARCHAR(255))
    INSERT INTO table1 VALUES (1, 'John'), (2, 'Alice')
    
    -- set number of rows you need
    DECLARE @RowsReqd INT = 5  
    
    -- find out the max ID we want to generate 
    DECLARE @Limit INT
    SELECT @Limit = MAX(ID) FROM table1
    
    -- generate the list
    ;WITH NumbersList
    AS (
        SELECT 1 AS Number, 1 AS ID
        UNION ALL
        SELECT Number + 1, Number % @Limit + 1 FROM NumbersList
        WHERE Number < @RowsReqd    
        )
    SELECT T.*
    FROM NumbersList NL
    INNER JOIN table1 T ON T.ID = NL.ID
    ORDER BY NL.Number
    OPTION (MAXRECURSION 10000) -- increase this value to generate more numbers
    

    输出:

    ID   NAME
    1    John
    2    Alice
    1    John
    2    Alice
    1    John
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-20
      • 2012-02-27
      • 2012-06-10
      • 2010-10-25
      • 2013-02-06
      • 2010-09-06
      相关资源
      最近更新 更多