【问题标题】:Left join where left table column = something or nullLeft join where left table column = something or null
【发布时间】:2019-09-05 01:17:54
【问题描述】:

我需要将左表与右表连接起来,即使右表没有匹配项,也要保留所有左表行。 ...一个标准的左连接。

仅包括符合条件的左侧表格行。

仅包括符合条件的右表行。如果没有找到,请在连接中使用 null。

如果不为null,则按右表中的列排序,但如果为null,则不要丢失条目。

在psudo sql中,我想要

(
    select
        *
    from
        work_item
    where
        work_item.id_work_item_queue = 5
) as t1

(
    select
        *
    from
        ai_guess
    where
        ai_guess.AI_Guess_Date = '2019:08:09:19:49:02'
) as t2

select
    t1.*,
    t2.*
from 
    t1
    left join t2 on t1.id_word_crop = t2.id_word_crop
ORDER BY
    ai_guess.text

我得出的解决方案是

SELECT 
    work_item.id_work_item,
    work_item.id_word_crop,
    ai_guess.text

FROM
    work_item
    LEFT JOIN ai_guess ON
    work_item.id_word_crop = ai_guess.id_word_crop

WHERE
    work_item.id_work_item_queue = 5
    AND
    ai_guess.AI_Guess_Date = '2019:08:09:19:49:02'

ORDER BY
    ai_guess.text

这会生成

id_work_item, id_word_crop, text
'4', '224343', 'eie'
'3', '224342', 'geüichrt'
'2', '224341', 'rschaunig'
'6', '224345', 'VSnge'

但它丢失并从左表输入

id_work_item, id_word_crop
'5', '224344'

左表包含

SELECT
    id_work_item,
    id_word_crop
FROM
    work_item
where
    id_work_item_queue = 5
    id_work_item, id_word_crop
    '2', '224341'
    '3', '224342'
    '4', '224343'
    '5', '224344'
    '6', '224345'

右表没有匹配项,因此删除了左条目,但我想保留左条目。

SELECT
    *
FROM
    ai_guess
where
    id_word_crop = 224344

返回空值

【问题讨论】:

  • 你试过RIGHT JOIN ai_guess而不是LEFT JOIN ai_guess吗?

标签: mysql sql


【解决方案1】:

ai_guess 表上的条件从WHERE 移动到ON 子句:

SELECT
    work_item.id_work_item,
    work_item.id_word_crop,
    ai_guess.text
FROM work_item
LEFT JOIN ai_guess
    ON work_item.id_word_crop = ai_guess.id_word_crop AND
       ai_guess.AI_Guess_Date = '2019:08:09:19:49:02'
WHERE
    work_item.id_work_item_queue = 5
ORDER BY
    ai_guess.text;

现在发生的情况是连接生成了您想要的中间结果,但随后 WHERE 子句过滤掉丢失的记录,因为它的猜测日期不匹配。通过将此限制置于连接条件中,它可以防止该记录被过早删除。

【讨论】:

    猜你喜欢
    • 2018-12-04
    • 1970-01-01
    • 2014-06-13
    • 2017-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多