Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL在表的两个副本之间使用WHERE子句依赖关系进行左自联接_Sql_Outer Join - Fatal编程技术网

SQL在表的两个副本之间使用WHERE子句依赖关系进行左自联接

SQL在表的两个副本之间使用WHERE子句依赖关系进行左自联接,sql,outer-join,Sql,Outer Join,以下两句话: hello there bye! 在表中,用以下词语表示: WORD_ID SENTENCE_ID WORD WORD_NUMBER 10 1 hello 1 11 1 there 2 12 2 bye! 1 我想执行一个外部联接查询,该查询将提供以下结果: WORD1 WORD2 hello there bye!

以下两句话:

hello there
bye!
在表中,用以下词语表示:

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

注意,我可能想从句子的中间开始,所以我不能假定Word2的词数=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);

只有在句子中有两个词的情况下,这才会给我一个结果。我不知道该怎么做,这并不复杂。

单词+1
要求移动到
左连接中

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
NECRO编辑:

虽然上面修复了左连接的使用,但我建议根本不要使用连接

SELECT
  sentence_id,
  MAX(CASE WHEN pos = 0 THEN word END)   AS word1,
  MAX(CASE WHEN pos = 1 THEN word END)   AS word2
FROM
(
  SELECT
    sentence_id,
    word_number - MY_START_NUMBER   AS pos,
    word
  FROM
    sentence_words
)
  AS offset_sentence_words
WHERE
  pos IN (0, 1)
GROUP BY
  sentence_id

Dems的答案绝对正确。我决定写这个答案来解释你原来的解决方案不起作用的原因。这是因为您正在尝试筛选left outter联接的以下结果集(显示所有列,某些名称缩写为fit):

现在,看看您的where子句:

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

。。。这应该相对容易理解为什么它不起作用。例如,
s2.word\u number
从不为
NULL

什么在使用mssql、mysql、oracel?您是在尝试重新创建句子还是只对返回成对的单词感兴趣?
where s1.word_number = my_start_number  
 and (s2.word_number = s1.word_number +1 or s2.word_number is null);