2012-04-26 60 views
8

下面兩個句子之間的條款依賴關係:SQL左自加入其中表的兩個副本

hello there 
bye! 

在表sentence_words表示爲:

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

我想做的事情外連接查詢,讓我的結果:

WORD1  WORD2 
hello  there 
bye!  NULL 

注意,我可能要在中間o開始F中的句子,所以我不能假設WORD2有word_number = 2。如果我選​​擇my_start_number = 2那麼查詢應該給我:

WORD1 WORD2 
there NULL 

我想:

(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); 

這只是給了我一個結果如果句子中有兩個單詞。我不確定該做什麼並不複雜。

+0

什麼是使用mssql,mysql,oracel? – Arion 2012-04-26 14:00:12

+0

你想重新創建一個句子嗎?或者你只是想返回一對單詞? – 2012-04-26 14:11:41

回答

10

word_number + 1要求移入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

輝煌 - 完美的作品。 – user984003 2012-04-26 14:05:18

1

德姆答案絕對是正確的。我決定寫這個答案來解釋你原來的解決方案不起作用的原因。這是因爲你試圖過濾以下結果集左outter的JOIN(顯示所有列,有一些名字縮寫爲適合):

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 

現在,來看看你的where子句:

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

...它應該相對容易明白爲什麼它不起作用。例如,s2.word_number從不是NULL