2012-04-26 7 views
8

Los siguientes dos frases:SQL dejó autocombinación con DONDE dependencias cláusula entre las dos copias de la tabla

hello there 
bye! 

están representados en el sentence_words mesa por:

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

que quiero hacer una consulta de combinación externa que me da los resultados:

WORD1  WORD2 
hello  there 
bye!  NULL 

Tenga en cuenta que es posible que desee comenzar en el medio o f la sentencia por lo que no se puede asumir que palabra2 tiene word_number = 2. Si decido my_start_number = 2, entonces la consulta debe dame:

WORD1 WORD2 
there NULL 

Traté:

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

Eso sólo me da resultado si hay dos palabras en la oración No estoy seguro de qué hacer, eso no es muy complicado.

+0

¿Qué están usando mssql, mysql, oracel? – Arion

+0

¿Estás tratando de volver a crear la oración o solo te interesan los pares de palabras de retorno? –

Respuesta

10

Mueva el requisito word_number + 1 al 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

Brillante - Funciona a la perfección. – user984003

1

Dems answer es absolutamente el correcto. Decidí escribir esta respuesta para explicar el motivo por el cual su solución original no funciona. Esto se debe a que está intentando realizar un filtrado del siguiente conjunto de resultados de la Outter combinación izquierda (mostrando todas las columnas, con algunos nombres abreviados para encajar):

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 

Ahora, echar un vistazo a su cláusula where:

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

... y debería ser relativamente fácil ver por qué no funciona. Por ejemplo, s2.word_number nunca es NULL.

Cuestiones relacionadas