SQL 全外连接重复问题

标签 sql sql-server tsql join outer-join

我一直在搜索这个,我只是看不出我哪里出错了。我希望有人能帮我弄清楚。我有两张表,一张是零件号的所有销售订单 (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/

相关文章:

sql-server - 如何防止 Entity Framework 在 SQL Server 中生成低效查询?

sql - T-SQL 查找带有单独换行符的字符串(缺少回车符)

mysql - 使用 pivot 命令时出现动态 SQL 错误

sql - MYSQL REGEXP/RLIKE 有什么建议吗?

sql - Oracle 和 MS SQL Server 中的 NOT 条件和 NOT() 有什么区别

c# - 在分层 SQL 数据库中查找所有父项

c# - 多事件结果集 (MARS) 在 SQL Server 中如何工作?

c# - 回滚后提交事务会发生什么?

sql - "OBJECT_NAME"函数不再返回对象的名称

mysql - SQL查询LIKE语句错误