2012-06-19 44 views
10

Trong ví dụ này, chúng ta có 3 bảng liên quan trên cơ sở dữ liệu SQLite:sqlite LEFT OUTER JOIN nhiều bảng

CREATE TABLE test1 (
    c1 integer, 
    primary key (c1) 
); 
CREATE TABLE test2 (
    c1 integer, 
    c2 integer, 
    primary key (c1, c2) 
);  
CREATE TABLE test3 (
    c2 integer, 
    c3 integer, 
    primary key (c2) 
); 

Bây giờ tôi cần phải tham gia tất cả các bảng:

 test1 -> test2 (with c1 column) 
      test2 -> test3 (with c2 column).

Tôi đã thử giải pháp này nhưng nó không chạy:

SELECT 
    * 
    FROM test1 a 
     LEFT OUTER JOIN test2 b 
         LEFT OUTER JOIN test3 c 
          ON c.c2 = b.c2 
      ON b.c1=a.c1 

nó mang lại cho tôi một lỗi: near "ON": syntax error.

Bất kỳ trợ giúp nào?

+1

sqlite3 Không bao giờ được sử dụng, nhưng đúng cú pháp SQL giữa các ý kiến ​​LEFT OUTER JOIN ... ON ... LEFT OUTER JOIN ... ON. .., và không tham gia lồng nhau.) – raina77ow

+0

Tôi đã sử dụng cú pháp này trên Oracle, PostgreSQL và SQLServer mà không gặp bất kỳ vấn đề gì. – ferpega

+1

Tham gia lồng nhau - hoặc 'JOIN (một JOIN hai JOIN ba) ON (one.id = two.id AND two.some_id = three.some_id)'? – raina77ow

Trả lời

28

Đây là sự sai lệch đơn giản của tuyên bố ON của bạn. Này tuân theo tiêu chuẩn SQL:

SELECT * 
FROM test1 a 
LEFT OUTER JOIN test2 b ON b.c1=a.c1 
LEFT OUTER JOIN test3 c ON c.c2=b.c2 

này được giải thích trong further depth here.

+0

Cảm ơn Nathaniel nó chạy tốt. Tôi đã sử dụng định dạng sql trước đó trong nhiều năm. Nhưng SQLite không thích nó nhiều. – ferpega

+0

Có thể triển khai cụ thể (ưa thích?) Có thể phân tích cú pháp nó, nhưng SQLite đó chỉ giữ cho thông số. –