2017-11-27 3 views
-1

에 값을 증가와 내가 작성해야이SQL 선택 번호 - 동적으로 각 행

id 
1 
2 
3 
4 
5 
... 
etc. 

처럼 뭔가가 반환 (테이블/열을 쿼리하지 않음) 동적 SQL SELECT 문을 작성하는 방법이 있나요 1에서 X까지의 값을 가져 오는 여러 일반 쿼리
(X는 이전에 다른 쿼리로 미리 결정됩니다.)

X가 5 일 때 데이터가 5 행을 반환합니다. 1 2 3 4 5
X가 27이면 데이터는 1 2 3 ... 27 등을 반환합니다. 추가 의견에

이이 제 3 자에의 Sybase 소프트웨어에 사용되며, 내가 그것을 만드는 것 같습니다과 테이블을 삭제하는 것은 당신이 집계 테이블을 사용할 수 있습니다

+0

을; (예를 들어, 원격 Sybase ASE 데이터베이스에서 실행되는 SQL Server T-SQL 코드를 작성하고 있습니까?), 다양한 제품 이름과 버전을 포함하도록 질문에 대한 세부 사항을 업데이트 할 수 있습니다. 우리가 더 자세하게 우리가 더 나은 ... 그렇지 않으면 우리는 당신의 환경에서 받아 들일 수 없거나 할 수없는 답변을 게시하는 시간을 낭비 할 수 있습니다. – markp

+0

그 번호를 어떻게 사용할지 더 자세한 예제를 제공 할 것을 권합니다. 현재 말한 바와 같이, 삽입, 삭제, 업데이트, 선택을 위해 번호를 사용하고 싶다면 말할 수 없습니다 ... 당신이 조인/SARG 목적으로 그들을 사용하고 싶다면 ... '선택'이라면 왜 그렇게 할 수 있습니까? 'do * select * from some_table from 1 ~ X id '와 같은 것을하십시오. – markp

+0

이 질문은 나에게'SArg '는 Op에서 인정하는 용어가 아님을 나타냅니다. – MatBailie

답변

2

물론 작동하지 않는 쿼리의 복잡성으로 제한하고 . http://www.sqlservercentral.com/articles/T-SQL/62867/

또는 필요한 것은 모두 ROW_NUMBER입니다. https://docs.microsoft.com/en-us/sql/t-sql/functions/row-number-transact-sql

+0

나는이 복잡한 데이터를 타사 sybse 소프트웨어로 전송할 수 없었고, hwy인데도 어려움을 겪고있다. (팁을 주셔서 감사하지만 새로운 것을 배웠다.) – Elizabeth

0

당신은 너무

declare @mx integer=4 

;with test as (
select 1 as id 
union all 
select id+1 
from test 
where id<@mx 
) 
select * from test 
+0

이상한 행동이 100을 넘는 것을 막기 위해 'MAXRECURSION (0)'을 포함시킬 수 있습니다. 당신은 32k 이상에 도달합니다 ... – MatBailie

+1

여기에주의하십시오 ... 계산에 사용 된 cte는 기본적으로 루프입니다. http://www.sqlservercentral.com/articles/T-SQL/74118/ –

0

27 선택과 같은 재귀 CTE를 시도 할 수 :

DECLARE @Count int = 1 
DECLARE @MaxCount int = 27 -- Whatever your incoming max is 

WHILE @Count <= @MaxCount 
BEGIN 
SELECT @Count 

SELECT @Count = @Count + 1 
END 

하나를 선택

CREATE TABLE #TEMPNUMS (AUTONUM INT IDENTITY (1,1), GHOSTVAL VARCHAR(1)) 


DECLARE @Count int = 1 
DECLARE @MaxCount int = 27 -- Whatever your incoming max is 

WHILE @Count <= @MaxCount 
BEGIN 
INSERT INTO #TEMPNUMS (GHOSTVAL) 
SELECT '' 

SELECT @Count = @Count + 1 
END 

SELECT AUTONUM FROM #TEMPNUMS 

DROP TABLE #TEMPNUMS 
+0

27 개의 단일 선택 또는 27 개의 선택이있는 선택을 원한다고 말할 수 없습니다. 두 답변 모두 포함되어 있습니다. –

+0

1 행을 27 행으로 선택하십시오. – Elizabeth

+0

하나의 선택으로 답변을 업데이트했습니다. –

0

는이 같은 CTE를 사용하려고 했습니까?

WITH OrderedRows (ROWN) 
AS (
    SELECT 1 AS ROWN 

    UNION ALL 

    SELECT r.ROWN + 1 AS ROWN 
    FROM OrderedRows r 
    WHERE r.ROWN < 100 
    ) 
SELECT * 
FROM OrderedRows 
+0

이상한 행동이 100을 넘어서는 것을 막기 위해'MAXRECURSION (0) '을 포함하고 싶을 수도 있습니다. 그리고 나서 32k 이상에 도달했을 때 존재하는 비용/문제를 설명하십시오 ... – MatBailie

+0

또한 두 값으로 시작하면 더 좋습니다 0과 1) 그리고 테이블 자체에 대해 조인을 시작합니다 * (재귀의 각 레벨은 작업하는 범위를 두 배로 늘려 훨씬 더 높은 범위와 더 나은 확장 성을 제공합니다) *. – MatBailie

+1

여기에주의하십시오 ... 계산에 사용되는 cte는 기본적으로 루프입니다. http://www.sqlservercentral.com/articles/T-SQL/74118/ –

0

당신의 최대 수는 이제까지 그 다음 다른 레이어를 추가 할 수있는 쿼리를 재구성해야합니다보다 큰 경우 9999을 될 수 없습니다 가정.

DECLARE @MaxCount int = 27 -- Whatever your incoming max is 

SELECT ones.n + 10*tens.n + 100*hundreds.n + 1000*thousands.n 
FROM (VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) ones(n), 
    (VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) tens(n), 
    (VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) hundreds(n), 
    (VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) thousands(n) 
    where ones.n + 10*tens.n + 100*hundreds.n + 1000*thousands.n between 1 and @MaxCount 
ORDER BY 1 

다른 비슷한 질문에 대한이 답변을 참조하십시오 : 당신은`타사 사이베이스의 software`와`임시 tables`의 복잡성을 언급 한 의견에 How to generate a range of numbers between two numbers?

+1

자신을 반복하지 않으려면'WITH SELECT AS * FROM (VALUES (0), (1), (2) (1), (3), (4), (5), (6), (7), (8), .' – MatBailie