【问题标题】:SQL query to JOIN two tables returning null when not foundSQL 查询 JOIN 未找到时返回 null 的两个表
【发布时间】:2020-03-05 11:09:51
【问题描述】:
table: p
p_id/t_id/
1,35
2,35
3,35
4,35
5,35
6,22
7,22
...

对于表 p,p_id 的所有可能值都已注册

table: mps
p_id/m_id/value
2,1001,0
4,1001,2
7,1005,1
...

对于表:mps,只注册了几个 p_id 值。

  • 我们如何加入两个表,使用以下语句?

  • 输出必须是:p_id、m_id 和 value。

  • 输入m_id(即:1001)和t_id(即:35)。

它必须显示所有p_id组合,当它在表mps中没有找到数据时,只显示null。

output example:
p_id, m_id, value
1,1001,null
2,1001,0
3,1001,null
4,1001,2
5,1001,null

我尝试了不同的 SQL 查询,但是当 p_id 未在表 mps 上注册时,我没有得到输出:

SELECT p.p_id, mps.value, mps.m_id 
FROM p LEFT JOIN
     mps
     ON p.p_id = mps.p_id 
WHERE p.t_id = 35 AND mps.m_id=1001

【问题讨论】:

  • P_id未注册时如何确定m_id?例如,您是如何在输出 1,1001,null 的第一行中为 m_id 获得 1001 的。 1001 是否对所有行都固定?
  • 输入中引入了m_id。首先:查询 m_id=input 的所有行。第二个加入两个表。有帮助吗?

标签: mysql sql join null


【解决方案1】:

由于对于不在mps 中的任何p_id,您将获得NULL mps 值,因此您需要将COALESCE 的值设置为m_id 以使其等于1001 对于@ 的值987654330@不在mps

SELECT p.p_id, COALESCE(mps.m_id, 1001) AS m_id, mps.value
FROM p 
LEFT JOIN mps ON p.p_id = mps.p_id AND mps.m_id = 1001
WHERE p.t_id = 35
ORDER BY p.p_id

输出:

p_id    m_id    value
1       1001    (null)
2       1001    0
3       1001    (null)
4       1001    2
5       1001    (null)

Demo on SQLFiddle

或者(以免重复1001 值)您可以CROSS JOIN 到由m_id = 1001 组成的派生表,然后LEFT JOINmps

SELECT p.p_id, m.m_id AS m_id, mps.value
FROM p 
CROSS JOIN (SELECT 1001 AS m_id) m
LEFT JOIN mps ON p.p_id = mps.p_id AND mps.m_id = m.m_id
WHERE p.t_id = 35
ORDER BY p.p_id

输出与上一个查询相同。 Demo on SQLFiddle

【讨论】:

  • 我们赢了!非常感谢
  • @P00LR0CK 不用担心 - 我很高兴能帮上忙。
【解决方案2】:

我认为您只想将过滤 t_id 移动到 WHERE 子句:

SELECT p.p_id, mps.value, mps.m_id, 
FROM p LEFT JOIN
     mps
     ON mps.p_id = p.p_id and mps.m_id = 1001
WHERE p.t_id = 35 

【讨论】:

  • 感谢您的回复,但返回的结果与我的查询相同。我没有得到未为该特定 m_id 注册的 p_id
  • @P00LR0CK 。 . .我为m_id 添加了过滤,您在我回答后将其添加到您的问题中。 mps 的过滤需要在 ON 子句中。在WHERE 子句中过滤p
【解决方案3】:

您在mps.m_id 中寻找的是有时不存在的数据,因此您必须自己提供;

SELECT p.p_id
     , 1001 AS m_id
     , mps.value
FROM p
   LEFT JOIN mps ON p.p_id = mps.p_id AND mps.m_id = 1001
WHERE p.p_id = 35;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-17
    • 1970-01-01
    • 1970-01-01
    • 2015-01-30
    • 2015-02-15
    • 2021-05-25
    • 1970-01-01
    相关资源
    最近更新 更多