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)都是一样的。就像左连接/左外连接一样,右/右外连接也是如此