我一直在搜索这个,我只是看不出我哪里出错了。我希望有人能帮我弄清楚。我有两张表,一张是零件号的所有销售订单 (SO),一张是零件号的所有采购订单 (PO)。我想将结果合并在一起。大多数情况下,每个零件的采购订单和销售订单数量不会相同。在此示例中,我有 2 个销售订单和 1 个采购订单。
Table 1 (SO)
Company Part SalesOrder
ABC 123 5530
ABC 123 6854
ABC 456 7772
ABC 456 6868
Table 2 (PO)
Company Part PurchaseOrder
ABC 123 9889
ABC 456 9308
ABC 456 9655
ABC 456 9774
我希望看到:
Company Part SalesOrder PurchaseOrder
ABC 123 5530 9889
ABC 123 6854 NULL
ABC 456 7772 9308
ABC 456 6868 9655
ABC 456 NULL 9774
但我看到:
Company Part SalesOrder PurchaseOrder
ABC 123 5530 9889
ABC 123 6854 9889
ABC 456 7772 9308
ABC 456 7772 9655
ABC 456 7772 9774
ABC 456 6868 9308
ABC 456 6868 9655
ABC 456 6868 9774
这是我的查询:
select coalesce(SO.Company, PO.Company) as Company,
coalesce(SO.Part, PO.Part) as Part,
SO.SalesOrder, PO.PurchaseOrder
from SO full outer join PO
on SO.Company=PO.Company and SO.Part=PO.Part
也许这不是我需要实现的完整外部联接?作为引用,我查看了类似的帖子
SQL Full Outer Join 和我认为我想要的结果与帖子中的结果相似,我认为我的查询看起来像所选的解决方案,但显然我在某处失败了。我非常感谢任何帮助。
- - 更新 - -
我想我造成了一些困惑,为此,我深表歉意。只是为了澄清,PO 和 SO 彼此之间没有关系,因为它们属于同一部分。不会创建特定的 PO 来实现特定的 SO。有些零件可能只有 SO(例如,制造零件),有些零件可能只有 PO(制造元素的组成部分)。某些部分碰巧有相同数量的 SO 和 PO,但大多数情况下,可能不止一个。例如,如果我想查看零件的历史事件,它可能有 4 个销售订单和 1 个采购订单。如果我要做一个联合,我基本上将“事件”(SO/Po)聚集到一列中,那么对于该部分,查询将返回 5 行事件(4 SO/1 PO)。但是,不是有 1 列和 5 行,我可以将其设置为有 2 列(一列用于 SO,另一列用于 PO)并有 4 行? SO 列中的所有行都不会为空,对于 PO 而言,4 行将为 null,而 1 行则不会。让第一行包含不为空的 PO 行只是一种视觉偏好,但绝不是第一行的 SO 和 PO 实际相关,除了它们碰巧在同一行上。
举一个完全不同的例子:
假设我有一个客户表和一个供应商表,它们都有“名称”和“州”的字段名称,我想列出我在加利福尼亚的所有客户或供应商。我可以做一个工会吗?
select c.name, 'Cust' as Type, c.state
from customer c
where c.state='CA'
union
select v.name, 'Vend', v.state
from vendor v
where v.state='CA'
我会得到类似的东西:
Name Type State
BB Shrimp Cust CA
Vista Inc Cust CA
Mary's Lamb Cust CA
Cali Coffee Cust CA
Cool Guys Cust CA
Tap Corp Vendor CA
Blue Supply Vendor CA
Sun Shore Vendor CA
但我想看到这个:
Vendor Customer State
Tap Corp BB Shrimp CA
Blue Supply Vista Inc CA
Sun Shore Mary's Lamb CA
NULL Cali Coffee CA
NULL Cool Guys CA
NULL Tap Corp CA
我可以看到你会问的地方,我为什么要看到那个,但是如果我以这种方式呈现数据,我可以将其放入 SSRS 并使其看起来像
State Vendors Customers
CA Tap Corp BB Shrimp
Blue Supply Vista Inc
Sun Shore Mary's Lamb
Cali Coffee
Cool Guys
现在为 Part 切换 State,为 PO 切换 Vendor,为 SO 切换 Customer,这就是我想要实现的目标。供应商和客户除了来自同一个州之外没有任何关系,有些州的供应商可能比客户多,他们可能有相同的,但不相关。 PO 和 SO 的目标相同。
最佳答案
看起来您想根据 PO 和 SO 的顺序配对它们,但 FULL OUTER JOIN 只是将它们以所有可能的组合配对。如果要捕获订单,则需要先执行 ROW_NUMBER():
SELECT COALESCE(SO2.company, PO2.company) AS Company,
COALESCE(SO2.part, PO2.part) AS Part,
so.salesorder,
po.purchaseorder
FROM (SELECT *,
Row_number()
OVER (
partition BY so.part, so.company
ORDER BY so.salesorder) AS SO_Sequence
FROM so) AS SO2
FULL OUTER JOIN (SELECT *,
Row_number()
OVER (
partition BY po.part, po.company
ORDER BY po.purchaseorder) AS PO_Sequence
FROM po) AS PO2
ON SO2.company = PO2.company
AND SO2.part = PO2.part
AND SO2.so_sequence = PO2.po_sequence
关于SQL 全外连接重复问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48571884/