2016-04-28 9 views
2

ich mit folgenden Daten eine Tabelle haben:MS SQL, wie n Zeilen aus der Tabelle wählen, auch wenn Tabelle n - x Reihen

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

Und wenn ich 5 Zeilen auszuwählen, möchte ich das nächste erhalten möchten Daten:

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

Gibt es irgendwelche Ideen, wie man das macht?

+1

Sie könnten ALLE Tabellen mit sich selbst verbinden, aber warum sollten Sie das in SQL machen? Ich nehme an, Sie bekommen die Daten, dann verarbeiten Sie sie mit Code. Es gibt keinen Grund mehr Daten von der Datenbank zu bekommen, als Sie benötigen. Sie können es später im Code anzeigen oder bearbeiten. –

+1

Mögliches Duplikat von [SQL: Wiederholen Sie eine Ergebniszeile mehrmals und nummerieren Sie die Zeilen] (http://stackoverflow.com/questions/10423767/sql-repeat-a-result-row-multiple-times-and-number- die-Reihen) – Yahya

Antwort

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 

OUTPUT:

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

Werke für n > 1 Reihen:

;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 

Ausgang:

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

(5 row(s) affected) 
Verwandte Themen