2012-05-30 29 views
8

Trong phiên bản SQLite 3.7.12.1 (console) truy vấn này không hoạt động:SQLite Bracket "không làm việc"

(SELECT * FROM A 
UNION 
SELECT * FROM B) 
EXCEPT 
(SELECT * FROM A 
INTERSECT 
SELECT * FROM B); 

Thông báo lỗi

Error: near line 1: near "(": syntax error

truy vấn này hoạt động trong SQL Server Management Studio . Các truy vấn khác có dấu ngoặc đơn hoạt động như mong đợi. Tui bỏ lỡ điều gì vậy?

Edit: để làm rõ:

SELECT * FROM A;  <-- works 
(SELECT * FROM A); <-- does not work [Error: near line 1: near "(": syntax error] 
SELECT * FROM A WHERE A.id IN (SELECT B.id FROM B); <-- works, so no fundamental issues with brackets and sqlite... 
+0

về ** Sửa ** ví dụ: đó là hành vi đúng theo 'ANSI SQL' – triclosan

Trả lời

6

Có vẻ như SQLite không thích hợp (sub) truy vấn (những người có UNION, UNION ALL, EXCEPT hoặc INTERSECT) được đặt trong ngoặc vuông:

  • này không hoạt động:

    (SELECT 1 AS v 
    UNION 
    SELECT 2) 
    EXCEPT 
    SELECT 1 
    
  • này không làm việc một trong hai: (. Nhưng bothwork trong SQL Server)

    SELECT 1 AS v 
    UNION 
    (SELECT 2 
    EXCEPT 
    SELECT 1) 
    

Và không có dấu ngoặc, các subselects cá nhân được kết hợp tuần tự, tức là không có ưu tiên vốn có đối với bất kỳ toán tử nào giống như trong một số sản phẩm SQL khác. (Ví dụ, đây

SELECT 1 AS v 
UNION 
SELECT 2 
INTERSECT 
SELECT 3 

returns 1 trong SQL Server (vì INTERSECT được thực hiện đầu tiên) và nothing trong SQLite.)

Cách giải quyết duy nhất có vẻ là để sử dụng những phần bạn muốn kết hợp, như truy vấn con , like this:

SELECT * 
FROM (
    SELECT * FROM A 
    UNION 
    SELECT * FROM B 
) 
EXCEPT 
SELECT * 
FROM (
    SELECT * FROM A 
    INTERSECT 
    SELECT * FROM B 
) 
1
((SELECT * FROM A) 
UNION 
(SELECT * FROM B)) 
EXCEPT 
((SELECT * FROM A) 
INTERSECT 
(SELECT * FROM B)); 
+1

không làm việc, tôi đã chỉnh sửa câu hỏi ban đầu của tôi để thu hẹp vấn đề. – user1425798

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