2013-02-22 49 views
5

CẤP Xin giúp chuyển đổi Oracle truy vấn đến SQL Server tương đương:SQL Server tương đương với Oracle CONNECT BY và pseudocolumn

SELECT (LEVEL+1-1) AS lvl 
    FROM dual 
CONNECT BY LEVEL <= 10 
/

Đầu ra là các số từ 1 đến 10:

LVL 
---- 
1 
2 
3 
... 
10 

Tôi biết có các phương thức phân cấp trong SQL Server và các trình dựng sẵn như GetLevel và hơn thế nữa. Điều này có thể được sử dụng để có được kết quả tương tự không?

Để tạo bảng kép nếu cần thiết (không chắc chắn) - sao chép từ đây: http://blog.sqlauthority.com/2010/07/20/sql-server-select-from-dual-dual-equivalent/

CREATE TABLE DUAL 
(
DUMMY VARCHAR(1) 
) 
GO 
INSERT INTO DUAL (DUMMY) 
VALUES ('X') 
GO 

Cụ thể tìm các ví dụ mà sẽ cho phép sử dụng smth. như LEVEL trong truy vấn. Ví dụ: chỉ có một ngày bắt đầu trong bảng - 4/22/2013. Nhưng với LEVEL tôi có thể tăng nó như sau:

SELECT start_date, start_date+LEVEL-1 AS start_date_btwn 
    FROM my_tab 
WHERE id = 1 
CONNECT BY LEVEL<=10 
/

START_DATE START_DATE_BTWN 
------------------------------ 
4/22/2013 4/22/2013 
4/22/2013 4/23/2013 
4/22/2013 4/24/2013 
4/22/2013 4/25/2013 
...... 
4/22/2013 4/30/2013 

Cảm ơn bạn rất nhiều trước.

+0

Có một số tối đa của số bạn cần? – sgeddes

+0

@sgeddes - không, trong Oracle có thể có bất kỳ số nào thay vì 10 như trong ví dụ của tôi. Tôi giới hạn ví dụ của tôi đến 10 để đơn giản. Cảm ơn bạn. – Art

+0

@Martin - Cảm ơn bạn. Điều này đã giúp. – Art

Trả lời

9

Một cách tôi đã thực hiện nó trong quá khứ được truy vấn spt_values như thế này:

SELECT number 
FROM master..spt_values 
WHERE 
    type = 'P' 
    AND number <= 255 

Tuy nhiên, nó không có một danh sách đầy đủ các con số. Một lựa chọn thay thế sẽ được tạo ra một CTE đệ quy như ví dụ:

WITH CTE AS (
    SELECT 1 as Number 
    UNION ALL 
    SELECT Number+1 
    FROM CTE 
    WHERE Number < 100 
) 
SELECT * FROM CTE 

SQL Fiddle Demo

+0

@ sgeddes- Cảm ơn bạn. Vẫn đang tìm kiếm equiv. tới các cột giả LEVEL. Tôi đã hy vọng cho các ví dụ với các phương pháp phân cấp cũng có. – Art

+0

@Art - Không có tiếp xúc tương đương với chúng tôi của cột cấp (mặc dù SQL Server theo dõi nó trong nội bộ để xem giới hạn đệ quy tối đa có đạt được hay không) nhưng không quan trọng để tự thêm cột cấp như trong [ví dụ tại đây ] (http://msdn.microsoft.com/en-us/library/ms186243 (v = sql.105) .aspx) –

+0

@Martin - Ví dụ tuyệt vời, cảm ơn bạn rất nhiều. – Art

Các vấn đề liên quan