2012-04-26 30 views
8

Sau đây hai câu:SQL trái tự tham gia với ĐÂU phụ thuộc khoản giữa hai bản sao của bảng

hello there 
bye! 

được trình bày trong các sentence_words bảng bằng cách:

WORD_ID SENTENCE_ID WORD WORD_NUMBER 
10  1    hello 1 
11  1    there 2 
12  2    bye! 1 

tôi muốn làm truy vấn tham gia bên ngoài mang lại cho tôi kết quả:

WORD1  WORD2 
hello  there 
bye!  NULL 

Lưu ý rằng tôi có thể muốn bắt đầu ở giữa o f câu vì vậy tôi không thể giả định word2 có word_number = 2. Nếu tôi chọn my_start_number = 2 thì truy vấn nên cung cấp cho tôi:

WORD1 WORD2 
there NULL 

tôi đã cố gắng:

(my_start_number = 1) 

select s1.word word1, s2.word word2 
from sentence_words s1 
left join sentence_words s2 
on s1.sentence_id = s2.sentence_id 
where s1.word_number = my_start_number 
and (s2.word_number = s1.word_number +1 or s2.word_number is null); 

đó chỉ mang lại cho tôi một kết quả nếu có hai từ trong câu. Tôi không chắc phải làm gì không phức tạp.

+0

Điều gì đang sử dụng mssql, mysql, oracel? – Arion

+0

Bạn đang cố gắng tạo lại câu hay bạn chỉ quan tâm đến các cặp từ trở lại? –

Trả lời

10

Di chuyển yêu cầu word_number + 1 vào LEFT JOIN.

SELECT 
    s1.word word1, s2.word word2 
FROM 
    sentence_words s1 
LEFT JOIN 
    sentence_words s2 
    ON s2.sentence_id = s1.sentence_id 
    AND s2.word_number = s1.word_number + 1 
WHERE 
    s1.word_number = my_start_number 
+0

Rực rỡ - Hoạt động hoàn hảo. – user984003

1

Câu trả lời câu hỏi hoàn toàn đúng. Tôi quyết định viết câu trả lời này để giải thích lý do giải pháp ban đầu của bạn không hoạt động. Điều này là do bạn đang cố gắng để lọc kết quả thiết lập sau đây của outter trái join (hiển thị tất cả các cột, với một số tên viết tắt là phù hợp):

s1.WORD_ID s1.SENT_ID s1.WORD s1.WORD_NUM s2.WORD_ID s2.SENT_ID s2.WORD s2.WORD_NUM 
10   1   hello 1   10   1   hello 1 
10   1   hello 1   11   1   there 2 
11   1   there 2   10   1   hello 1 
11   1   there 2   11   1   there 2 
12   2   bye!  1   12   2   bye!  1 

Bây giờ, hãy nhìn vào mệnh đề where của bạn:

where s1.word_number = my_start_number 
and (s2.word_number = s1.word_number +1 or s2.word_number is null); 

... và sẽ tương đối dễ dàng để xem tại sao nó không hoạt động. Ví dụ: s2.word_number không bao giờ là NULL.

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