SQL 在表的两个副本之间保留了自连接和 WHERE 子句依赖关系



以下两句话:

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

请注意,我可能想从句子中间开始,所以我不能假设 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);

只有当句子中有两个单词时,这才会给我一个结果。我不确定该怎么做并不复杂。

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

死灵编辑:

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

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的答案绝对是正确的。我决定写这个答案来解释你原来的解决方案不起作用的原因。这是因为您正在尝试筛选左侧外联接的以下结果集(显示所有列,其中一些名称缩写为适合):

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

最新更新