2010-02-23 7 views
2

는 SQL 구문 또는 같은 것을 할 수있는 트릭이 있습니까?SQL 범위 연산자

CREATE TABLE _range (i INT PRIMARY KEY); 

INSERT INTO _range VALUES 0; 
INSERT INTO _range VALUES 1; 

이 더 나은 방법이 있나요 입력 :

내 첫번째 생각은 같은 임시 테이블을 만드는 것입니다?

UPDATE :

나는이 특별한 경우에 SQLite는 사용하지만 일반적인 대답에 관심이 있어요.

+0

당신이 다른 쿼리에 대한 제한으로서이 필요하십니까 : MS SQL와 –

+0

@Goran Rakic ​​: 맞습니다. 나는 두 테이블 (T1, T2)에 가입해야합니다. 그들은 날짜를 포함하지 않습니다. 그렇다면 T1 기록과 T2 기록을 일치시키는 매우 복잡한 술어가 있습니다. 술어는 T1, T2 및 두 날짜 D1 및 D2의 값에 따라 다릅니다. 날짜 D1은 공 간으로 주어지며, D2는 D1에서 D1 + 10까지의 범위에있을 수 있습니다. – danatel

+0

(D2> = D1 및 D2 =

답변

1

매우 흥미로운 질문을. 좋아, 그래서 크로스 조인을 사용하지 왜 생각에 도착 : 여기에 귀하의 범위는 정말 작은하지 않는 한 아마 쓸모가 못생긴 해킹 ...

select * from (
    select 1 as num UNION 
    select 2 as num UNION 
    select 3 as num UNION 
    select 4 as num UNION 
    select 5 as num UNION 
    select 6 as num UNION 
    select 7 as num UNION 
    select 8 as num UNION 
    select 9 as num UNION 
    select 10 as num 
) t ; 

+-----+ 
| num | 
+-----+ 
| 1 | 
| 2 | 
    .... 
| 9 | 
| 10 | 
+-----+ 
10 rows in set (0.00 sec) 

편집입니다. 그래서, 여기에 또 다른 해킹이 있습니다.이 메모리는 여러분을 메모리 테이블에서 꽤 빠르게 쌓아 올릴 것이며 아마도 합리적으로 좋을 것입니다.

select POW(2,0)*t0.num + POW(2,1)*t1.num + POW(2,2)*t2.num + POW(2,3)*t3.num 
as num 
from (
    select 0 as num UNION 
    select 1 as num 
) t0, (
    select 0 as num UNION 
    select 1 as num 
) t1, (
    select 0 as num UNION 
    select 1 as num 
) t2, (
    select 0 as num UNION 
    select 1 as num 
) t3 
order by num ; 
+------+ 
| num | 
+------+ 
| 0 | 
| 1 | 
    .... 
| 14 | 
| 15 | 
+------+ 
16 rows in set (0.00 sec) 

쉽게 2의 제곱으로 가고 충분히 빠를 것입니다. 기록을 곱

+0

두 번째 것은 좋습니다. – danatel

1

어떤 DB를 사용하고 있습니까? between 연산자는 일반적으로 SQL에 대한 합법적 인 구문입니다. 우리는 날짜 범위에 대해 항상이 값을 사용합니다. http://www.w3schools.com/Sql/sql_between.asp

SELECT column_name(s) 
FROM table_name 
WHERE column_name 
BETWEEN value1 AND value2 
+1

필자는 값을 테스트하는 데 BETWEEN을 사용하고 싶지는 않지만 (꽤 공통적 인) 값을 생성하고 싶습니다 (anshul의 대답 참조). – danatel

0

에서

당신은 당신이 사용하는 DBMS를 지정하지 않았지만, Oracle 당신은 CONNECT BY을 사용할 수

SELECT ROWNUM-1 i 
FROM dual 
CONNECT BY ROWNUM <= 10 + 1 
0

SQL의 구문은 내가 당신의 요구와 의견에서 확실하지 않다 CROSS JOIN 입니다,하지만 난 당신이 그렇게하려고하는 것 같아요.

20 년 동안 문자열 "YYYYMM"로 날짜 스탬프를 사용하여 테이블을 채우는 것과 비슷한 작업을 수행했습니다.

;with numbs as 
(
    select 1 as col 
    union all 
    select col + 1 from numbs 
    where col < 10 
) 

select * from numbs 
+0

임시 테이블을 만들지 않고 크로스 조인을 사용하여 1에서 10 사이의 범위를 어떻게 생성합니까? – danatel

0

당신은 CTE를 사용할 수 있을까?