SQL:跨两个层次结构的完全外部联接

SQL:跨两个层次结构的完全外部联接,sql,join,outer-join,full-outer-join,Sql,Join,Outer Join,Full Outer Join,假设我有一张表,上面有装运的零件和收据上的零件。我想将我发送的内容与我收到的内容进行匹配,并用一个通用的装运编号绑定在一起 发货表 SHIPMENT NO PART NO 1 A 1 B 2 A 2 C SHIPMENT NO PART NO 1 A 1 C 2 B 3

假设我有一张表,上面有装运的零件和收据上的零件。我想将我发送的内容与我收到的内容进行匹配,并用一个通用的装运编号绑定在一起

发货表

SHIPMENT NO    PART NO
 1              A
 1              B
 2              A
 2              C
SHIPMENT NO    PART NO
 1              A
 1              C
 2              B
 3              A
接收表

SHIPMENT NO    PART NO
 1              A
 1              B
 2              A
 2              C
SHIPMENT NO    PART NO
 1              A
 1              C
 2              B
 3              A
期望的结果

SHIP. SHIP. NO    SHIP. PART NO    RPT. SHIP. NO    RPT. PART NO
 1                 A                1                A
 1                 B                1                NULL
 1                 NULL             1                C
 2                 A                2                NULL
 2                 NULL             2                C
 NULL              NULL             3                A
因此,我们的想法是,有一个完整的外部连接,显示所有不同的装运编号以及装运和收据的相应零件号,但在匹配的地方将它们连接在一起。即使零件号不匹配,复杂的问题仍然存在

基本上有两个连接条件,其中一个是完全可选的


我确信这个解决方案非常简单,但我看不出在不使用联合的情况下如何做到这一点。

使用
完全连接

SELECT S.*, R.*
FROM Shipment S 
FULL JOIN Receipt R
 ON S.[SHIPMENT NO] = R.[SHIPMENT NO]
AND S.[PART NO] = R.[PART NO]
试试这个

CREATE TABLE Shipment ([SHIPMENT NO] int, [PART NO] varchar(1))    
INSERT INTO Shipment ([SHIPMENT NO], [PART NO])
VALUES
    (1, 'A'),
    (1, 'B'),
    (2, 'A'),
    (2, 'C')
;
CREATE TABLE Receipt ([SHIPMENT NO] int, [PART NO] varchar(1));    
INSERT INTO Receipt  ([SHIPMENT NO], [PART NO])
VALUES
    (1, 'A'),
    (1, 'C'),
    (2, 'B'),
    (3, 'A')
;

SELECT 
     X.ShipmentShipNO AS 'SHIP. SHIP. NO'   
    ,s.[PART NO] AS 'SHIP. PART NO'
    ,X.ReceiptShipNO AS 'RPT. SHIP. NO'
    ,r.[PART NO] AS 'RPT. PART NO'

FROM Shipment s
FULL OUTER JOIN Receipt r ON s.[SHIPMENT NO] = r.[SHIPMENT NO] AND s.[PART NO] = r.[PART NO]
FULL OUTER JOIN 
                (
                    SELECT DISTINCT
                        s.[SHIPMENT NO] AS'ShipmentShipNO'
                        ,r.[SHIPMENT NO] AS'ReceiptShipNO'
                        FROM Shipment s
                        FULL JOIN Receipt r ON s.[SHIPMENT NO] = r.[SHIPMENT NO]
                )X ON r.[SHIPMENT NO] = X.ReceiptShipNO OR s.[SHIPMENT NO] = X.ShipmentShipNO
ORDER BY 3


DROP TABLE Shipment
DROP TABLE Receipt

始终尝试包含一个rdbms标记、SqlServer、MySql?因此,请确认,–Part no–join条件是否可选?欢迎使用stackoverflow。我想你是对的。当你想展示一个有效的答案时,你是否检查了帮助。有一个漂亮的
文本到ddl
函数来帮助准备数据模式。还有一个纯文本输出,这样你就可以把输出粘贴成答案而不是图片了!我知道有一种基本的连接样式可以实现这一点,但以前没有理由使用
完全连接
。。。这很尴尬,因为我甚至在我的帖子中使用了短语
fullouterjoin
。@Justin,它们(fulljoin,fullouterjoin)都是一样的。就像左连接/左外连接一样,右/右外连接也是如此