MySQL - 一对多连接 - 从“一个”表中仅返回 1 行的结果
Posted
技术标签:
【中文标题】MySQL - 一对多连接 - 从“一个”表中仅返回 1 行的结果【英文标题】:MySQL - One to Many Join - Return results for only 1 row from "One" table 【发布时间】:2015-10-09 21:47:02 【问题描述】:对不起....应该说,这是 mysql。
好吧....首先,我不知道我是否真的可以做我想做的事。我有一些使用 SQL 的经验,但不是很多。希望有人可以提供帮助。
我有两张桌子,一张有订单,一张有发货。我可以在它们之间进行连接并获得正确的结果.....
订单表
Order_ID | Revenue |
1001 | 125.00 |
1002 | 215.31 |
1003 | 654.43 |
发货表
Order_ID | Shipment_ID | Item Count |
1001 | 99001 | 25 |
1001 | 99002 | 5 |
1002 | 99003 | 65 |
1003 | 99004 | 123 |
1003 | 99005 | 20 |
通过 Order_ID 上的直接连接,我得到了预期的结果:
Order_ID | Revenue | Shipment_ID | Item Count |
1001 | 125.00 | 99001 | 25 |
1001 | 125.00 | 99002 | 5 |
1002 | 215.31 | 99003 | 65 |
1003 | 654.43 | 99004 | 123 |
1003 | 654.43 | 99005 | 20 |
如果可能的话,我正在尝试在相同的输出中协调收入和成本。我从一张单独的表格中知道我每批货物的成本是多少,所以数学很简单。但是,我的收入是这样的,因为我的收入列中有重复,因为订单要分多次发货。
我想得到类似以下的东西:
Order_ID | Revenue | Shipment_ID | Item Count |
1001 | 125.00 | 99001 | 25 |
1001 | NULL | 99002 | 5 |
1002 | 215.31 | 99003 | 65 |
1003 | 654.43 | 99004 | 123 |
1003 | NULL | 99005 | 20 |
重复收入数字的值可以是空值、空白、0,以及将计算的值以外的任何值。有任何想法吗?
提前致谢!
马修
【问题讨论】:
您使用的是哪个 RDBMS,MySQL,SQL Server,...? 您的成本栏在哪里?除非您需要详细的装运输出,否则您可能会创建一个每个订单一行的输出,并将装运成本相加。 【参考方案1】:在 MySQL 中,您可以使用以下查询:
SELECT s1.Order_ID, s1.Shipment_ID, s1.Item_Count,
IF(s1.Shipment_ID = s2.minS_ID, o.Revenue, 0) AS Revenue
FROM Shipments AS s1
INNER JOIN (
SELECT Order_ID, MIN(Shipment_ID) AS minS_ID
FROM Shipments
GROUP BY Order_ID
) AS s2 ON s1.Order_ID = s2.Order_ID
INNER JOIN Orders AS o ON s1.Order_ID = o.Order_ID
我们的想法是对包含最小Shipment_ID
每个Order_ID
的派生表执行附加连接。如果当前行的Shipment_ID
值等于这个值则返回Revenue
,否则返回0。
Demo here
在 SQL Server 中,您可以使用窗口版本的MIN
进行比较:
SELECT s.Order_ID, Shipment_ID, Item_Count,
CASE
WHEN MIN(Shipment_ID) OVER (PARTITION BY s.Order_ID) = Shipment_ID THEN Revenue
ELSE 0
END AS Revenue
FROM Shipments AS s
INNER JOIN Orders AS o ON s.Order_ID = o.Order_ID
【讨论】:
以上是关于MySQL - 一对多连接 - 从“一个”表中仅返回 1 行的结果的主要内容,如果未能解决你的问题,请参考以下文章
Access 2010 中 1:M Join 的左表中仅显示唯一记录