Sql-Server
SQL Server:如何將完全聯接添加到兩個表但匹配排隊?
我正在使用具有兩個數據庫的系統。一個用於 ERP 系統,一個用於網站。兩個數據庫都有備用程式碼表。我正在嘗試編寫一個查詢來顯示兩個數據庫的備用程式碼表之間的差異和匹配。
在這裡設置我的環境是一個小範例:
CREATE TABLE [dbo].[alt_code_ERP]( [UID] [int] NOT NULL, [item_id] [nchar](10) NOT NULL, [alternate_code_ERP] [nvarchar](50) NOT NULL, ) ON [PRIMARY] GO CREATE TABLE [dbo].[web_alt_code]( [UID] [int] NOT NULL, [item_id] [nchar](10) NOT NULL, [web_alternate_code] [nchar](50) NOT NULL ) ON [PRIMARY] GO INSERT INTO [dbo].[alt_code_ERP] ([UID],[item_id],[alternate_code_ERP]) VALUES (1, 'part1' , 'part1_alt') INSERT INTO [dbo].[alt_code_ERP] ([UID],[item_id],[alternate_code_ERP]) VALUES (2, 'part2' , 'part2a_alt') INSERT INTO [dbo].[alt_code_ERP] ([UID],[item_id],[alternate_code_ERP]) VALUES (3, 'part2' , 'part2b_alt') INSERT INTO [dbo].[alt_code_ERP] ([UID],[item_id],[alternate_code_ERP]) VALUES (4, 'part2' , 'part2c_alt') INSERT INTO [dbo].[alt_code_ERP] ([UID],[item_id],[alternate_code_ERP]) VALUES (5, 'part10' , 'part10_alt') GO INSERT INTO [dbo].[web_alt_code] ([UID],[item_id],[web_alternate_code]) VALUES (1, 'part1' , 'part1_alt') INSERT INTO [dbo].[web_alt_code] ([UID],[item_id],[web_alternate_code]) VALUES (2, 'part2' , 'part2a_alt') INSERT INTO [dbo].[web_alt_code] ([UID],[item_id],[web_alternate_code]) VALUES (3, 'part2' , 'part2d_alt') INSERT INTO [dbo].[web_alt_code] ([UID],[item_id],[web_alternate_code]) VALUES (4, 'part8' , 'part8_alt') INSERT INTO [dbo].[web_alt_code] ([UID],[item_id],[web_alternate_code]) VALUES (5, 'part10', 'part10b_alt') GO
我想要一個具有以下內容的結果:
- 列出每個表中的每個備用程式碼一次。
- 如果這兩個表中有任何匹配的替代程式碼,我想將它們並排對齊。
- 任何在另一個表中沒有匹配項的都與 NULL 配對
如下所示:
item_id alternate_code_erp web_alternate_code
part1 part1_alt part1_alt part2 part2a_alt part2a_alt part2 part2b_alt NULL part2 part2c_alt NULL part2 NULL part2d_alt part8 NULL part8_alt part10 part10_alt NULL part10 NULL part10b_alt
item_id 和alternate_code 上的完整外連接應該可以解決問題。
SELECT COALESCE([a].[item_id], [b].[item_id]) as item_id, [a].[alternate_code_ERP], [b].[web_alternate_code] FROM [alt_code_ERP] AS [a] FULL OUTER JOIN [web_alt_code] AS [b] ON [a].[item_id] = [b].[item_id] AND [a].[alternate_code_ERP] = [b].[web_alternate_code];
您可以使用 FULL OUTER JOIN。
SELECT ISNULL(a.item_id, w.item_id) AS item_id, a.alternate_code_ERP, w.web_alternate_code FROM alt_code_erp a FULL OUTER JOIN web_alt_code w ON a.item_id = w.item_id AND a.alternate_code_ERP = w.web_alternate_code ORDER BY 1, ISNULL(a.alternate_code_ERP, w.web_alternate_code)
如果您需要,我添加了一個 ORDER BY。它仍然不完全相同,但是如果不進行一些字元串操作,您將不會像您想要的那樣獲得 item_id 的訂單。