Sql-Server

SQL Server:如何將完全聯接添加到兩個表但匹配排隊?

  • September 23, 2015

我正在使用具有兩個數據庫的系統。一個用於 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

我想要一個具有以下內容的結果:

  1. 列出每個表中的每個備用程式碼一次。
  2. 如果這兩個表中有任何匹配的替代程式碼,我想將它們並排對齊。
  3. 任何在另一個表中沒有匹配項的都與 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 的訂單。

引用自:https://dba.stackexchange.com/questions/115824