mysql 没有匹配的记录_如果没有匹配的记录,MySql查询将获得两列的所有组合

正如预期的那样,

Your first outer join产生:

| REASON | MONTH |

-------------------

| A | May |

| A | May |

| A | July |

| A | June |

| B | May |

| B | June |

| D | (null) |

但是,因为如果连接条件至少满足一次(如果条件永远不满足则只引入NULL记录),则外连接会产生结果,因此your second outer join不会产生(B,7月)的记录;它也完全丢弃了Reason =’D’,因为连接条件没有得到满足(并且所有三个月都在其他地方得到满足):

| REASON | MONTH |

------------------

| A | May |

| A | May |

| B | May |

| A | June |

| B | June |

| A | July |

虽然您可以解决Reason =’D’by adding或a.Month IS NULL对您的连接条件的损失,但您仍然不会产生(B,7月).相反,因为您想获得每对(Reason,Month),您必须使用物化月份表CROSS JOIN您的物化原因表:

SELECT Reason, Month

FROM

(

SELECT 'A' AS Reason

UNION ALL SELECT 'B'

UNION ALL SELECT 'D'

) Reasons CROSS JOIN (

SELECT 'May' AS Month

UNION ALL SELECT 'June'

UNION ALL SELECT 'July'

) Months

| REASON | MONTH |

------------------

| A | May |

| B | May |

| D | May |

| A | June |

| B | June |

| D | June |

| A | July |

| B | July |

| D | July |

然后,您只需要将结果与您的基础数据进行外连接:

SELECT Reason, Month, SUM(Down_time) downtime

FROM

(

SELECT 'A' AS Reason

UNION ALL SELECT 'B'

UNION ALL SELECT 'D'

) Reasons CROSS JOIN (

SELECT 'May' AS Month

UNION ALL SELECT 'June'

UNION ALL SELECT 'July'

) Months

LEFT JOIN tabledown USING (Reason, Month)

GROUP BY Reason, Month

| REASON | MONTH | DOWNTIME |

-----------------------------

| A | July | 3 |

| A | June | 8 |

| A | May | 7 |

| B | July | (null) |

| B | June | 6 |

| B | May | 5 |

| D | July | (null) |

| D | June | (null) |

| D | May | (null) |

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值