2014-04-03 14 views
7

Có cách nào để xây dựng một CTE cho một danh sách các giá trị mã hóa cứng không? Ví dụ: tôi có danh sách các ID đã biết (tức là 101,102,105,200 ...), làm cách nào để tôi có thể tạo CTE với một cột được gọi là ID nhưng tất cả các giá trị ID được mã hóa cứng trong truy vấn? BTW, tôi cần phải chạy truy vấn này trong Oracle. Cảm ơn!Tạo danh sách các giá trị được xác định trong CTE

Trả lời

10

Bạn có thể làm một cái gì đó giống như

WITH cte AS (
    SELECT 101 id FROM dual UNION ALL 
    SELECT 102 FROM dual UNION ALL 
    SELECT 105 FROM dual UNION ALL 
    SELECT 200 FROM dual UNION ALL 
    ... 
) 

Tùy thuộc vào những gì bạn đang thực sự cố gắng để hoàn thành, tuy nhiên, bạn có thể muốn tuyên bố một bộ sưu tập và sử dụng (có hoặc không có chức năng phân tích một bằng dấu phẩy chuỗi)

CREATE TYPE num_tbl 
    AS TABLE OF NUMBER; 

WITH cte AS (
    SELECT column_value 
    FROM TABLE(num_tbl(101, 102, 105, 200)) 
) 
+0

Chỉ cần thêm các phiên bản gần đây cho phép các bí danh cột cho các mệnh đề bao thanh toán con được định nghĩa riêng biệt, có khả năng giữ mệnh đề truy vấn một bit neater: WITH cte (id) as (SELECT 101 từ kép ... http://docs.oracle.com/database/121/SQLRF/statements_10002.htm#SQLRF01702 –

7

EDIT: giải pháp thông báo trước đây chỉ hoạt động cho MSSQL. Vì vậy tôi đang thêm một giải pháp Oracle. Tôi đang giữ câu trả lời ban đầu bên dưới.

Tôi đã nghĩ đến một giải pháp nữa (mặc dù giải pháp được cung cấp bởi Justin Cave vẫn có vẻ tốt hơn một chút) - sử dụng bảng tạm thời.

Sau đây là cách nó có thể trông giống như

CREATE GLOBAL TEMPORARY TABLE temp_ids 
    (id INT) 
    ON COMMIT PRESERVE ROWS; 

INSERT INTO ids (id) VALUES (101); 
INSERT INTO ids (id) VALUES (102); 
INSERT INTO ids (id) VALUES (103); 

này phải là một giải pháp hợp lệ cho cơ sở dữ liệu Oracle.

câu trả lời gốc bên dưới


Tôi đã bắt gặp vấn đề tương tự và đây là giải pháp của tôi (điều này không hoạt động trên Oracle DB như đã đề cập trong các ý kiến, chỉ MSSQL dù)

WITH cte AS (
    SELECT * FROM (
     VALUES 
      (1, 2, 3, ...), 
      (2, 3, 4, ...) 
     ) AS a (col1, col2, col3, ...) 
    ) 
INSERT INTO ... 

Hope Điều này giúp :)

+1

Cú pháp này không hợp lệ trong Oracle. –

+0

Vì vậy, tôi xin lỗi vì sự nhầm lẫn và cảm ơn bạn đã cung cấp thông tin. Hy vọng rằng điều này sẽ giúp người khác tìm kiếm tương tự trong MSSQL. – Zax

+0

Ok, tôi đã chỉnh sửa câu trả lời trước đó và thêm vào những gì tôi nghĩ là một giải pháp hợp lệ cho Oracle. – Zax

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