sql - 两个 INNER JOIN 的 FULL OUTER JOIN
问题描述
我有三张桌子。我的表Order
有一个Id
和一个Date
。同样,我的桌子Delivery
有一个Id
和一个Date
。我的第三张表Part
有一个,和Id
两个外键: , 。Order
Delivery
OrderId
DeliveryId
我想创建一个查询,让我大致了解每月的订单和交货数量,如下所示:
+------+-------+------------+---------------+
| Year | Month | OrderCount | DeliveryCount |
+------+-------+------------+---------------+
| 2021 | 2 | 10 | 12 |
+------+-------+------------+---------------+
| 2021 | 1 | 234 | 213 |
+------+-------+------------+---------------+
| ... | ... | ... | ... |
+------+-------+------------+---------------+
所以我创建了一个查询,每月给我订单:
SELECT
MONTH(o.[Date]) AS [Month],
YEAR(o.[Date]) AS [YEAR],
COUNT(p.Id) AS OrderCount
FROM
Part AS p
INNER JOIN
[Order] AS o ON o.Id = p.OrderId
GROUP BY
MONTH(o.[Date]), YEAR(o.[Date])
一个用于每月交货:
SELECT
MONTH(d.[Date]) AS [Month],
YEAR(d.[Date]) AS [YEAR],
COUNT(p.Id) AS DeliveryCount
FROM
Part AS p
INNER JOIN
Delivery AS d ON d.Id = p.DeliveryId
GROUP BY
MONTH(d.[Date]), YEAR(d.[Date])
但现在我正在努力加入他们。我想我需要一个FULL OUTER JOIN
,因为当没有订单但交货时我需要 Month/Year/DeliveryCount,反之亦然。
我试过的是
SELECT
MONTH(o.Date) AS [Month]
YEAR(o.Date) as [Year]
COUNT(p.Id) as OrderCount
FROM
Part AS p
INNER JOIN
[Order] AS o ON o.Id = p.OrderId
GROUP BY
MONTH(o.Date), Year(o.Date)
FULL OUTER JOIN
(SELECT
MONTH(d.Date) AS [Month]
YEAR(d.Date) as [Year]
COUNT(pp.Id) as DeliveryCount
FROM
Part AS pp
INNER JOIN
Delivery AS d ON d.Id = pp.DeliveryId
GROUP BY
MONTH(d.Date), YEAR(d.Date)) AS d ON d.[Month] = MONTH(o.Date) AND d.[Year] = YEAR(o.Date)
但这不是FULL OUTER JOINS
工作方式。
如何获得这两个内部联接的完整外部?或者这种外部连接两个内部连接的方法首先是错误的?
解决方案
您必须将两个查询视为子查询。这应该会给你想要的结果
Select Orders.OrderCount, Deliveries.DeliveryCount
from (
SELECT
MONTH(o.Date) AS [Month]
YEAR(o.Date) AS [YEAR]
COUNT(p.Id) AS OrderCount
FROM
Part AS p
INNER JOIN
[Order] AS o ON o.Id = p.OrderId
GROUP BY
MONTH(o.Date), YEAR(o.Date)
) Orders
FULL OUTER JOIN
(
SELECT
MONTH(d.Date) AS [Month]
YEAR(d.Date) AS [YEAR]
COUNT(p.Id) AS DeliveryCount
FROM
Part AS p
INNER JOIN
Delivery AS d ON d.Id = p.DeliveryId
GROUP BY
MONTH(d.Date), YEAR(d.Date) ) Deliveries
on Orders.Month = Deliveries.Month
and Orders.Year = Deliveries.Year
推荐阅读
- mysql - MariaDB/ MySQL:无法从交叉连接中消除重复对
- linux - 测试 sysfs 热驱动 API
- regex - 当单元格匹配没有特定字符集的内容时如何返回值?使用正则表达式匹配
- ios - 为什么 App Store 上的应用截图是随机排列的?
- c# - WPF 文本框命令绑定
- javascript - 获取过滤键的值
- elasticsearch - ElasticSearch,如果在其他对象中写入对象,性能会下降吗?
- git - ssh-agent 的问题:在 Windows 10 上关闭 git 终端后 ssh-agent 不起作用
- python - 如何使用列表理解从 .txt 文件中过滤出列表?
- laravel - Laravel 审计是否适用于大规模插入