2017-04-03 87 views
0

我有兩個表具有相同字段,但計算結果稍有不同。我需要將來自這兩個表格的數據合併爲一個,但在匹配時需要優先考慮一個記錄的優先級。你知道這可能嗎?SQL在兩個表中匹配的行上選擇一行

下面是一個模擬了兩個匹配的記錄:如果

ID Balance  Type CCY Payment  Final_Balance 
28 1068376.037 F - CC GBP 78124   990252.0367 
28 1068376.037 F - DD GBP 982905   85470.08293 

道歉格式出來不好,我不能確定如何格式化表數據。

我在這兩個表中有成千上萬的記錄,但對於少數記錄,我在兩個表中都有相同的信息。基本上我想找到的是我希望它通過F-DD選擇F-CC的比賽,所以我最終得到了我的決賽桌中的唯一記錄。

感謝

+4

請不要使用不適用於您的問題標籤。我刪除了數據庫標記,因爲它不清楚你實際使用了哪一個。請添加*標籤*您實際使用的數據庫 –

+0

謝謝我只在問題的底部使用了推薦的標籤。可能對您最好聯繫Stackoverflow,並要求他們修改它們,除非聯繫每個人,否則這是您花時間做的事情。 – Carlos80

+1

@ Carlos80:不可以。Stackoverflow建議*可能匹配的標籤。它無法知道您正在使用的DBMS。它只能建議最有可能的。所以:這是什麼? MySQL的? PostgreSQL的? SQL Server?甲骨文? ...瞭解DBMS以便給出適當的答案非常重要。 –

回答

0

我個人使用ROW_NUMBER()這樣的事情,但有可能是一個更好的解決方案。

您可以重新運行該SQL顯示最終的答案是如何慢慢地建立起來:

declare @t1 table (id int) 
declare @t2 table (id int, txt varchar(2)) 

insert into @t1 
select 1 union 
select 2 

insert into @t2 
select 1, 'FC' union 
select 1, 'FD' union 
select 2, 'FC' union 
select 2, 'FD' 

select *, row_number() over (partition by id order by txt) as we_want_the_ones 
from @t2 

select * from (
    select id, txt, row_number() over (partition by id order by txt) as we_want_the_ones 
    from @t2 
) z 
where we_want_the_ones = 1 

select * 
from @t1 a 
join (
    select * from (
     select id, txt, row_number() over (partition by id order by txt) as we_want_the_ones 
     from @t2 
    ) z 
    where we_want_the_ones = 1 
) b on a.id = b.id 
0

我這個問題的理解是,你有兩個表(AB),它具有完全相同的列。你想把這些表UNION整合到一個數據集中,但是有時你在兩個表中有「匹配」的行。在這種情況下,您只能根據某個優先級選取其中一行。

從你的例子似乎..

  • 比賽:ID是一樣的發生。
  • 優先級:基於Type列,按照字母順序排列優先。

另外我假設SQL Server,因爲這是我喜歡的,你沒有說。

希望這一切是正確的..現在,這裏是我將如何處理它。

我首先執行兩張表的UNION。記錄所有記錄,而不用擔心匹配,將它們放入臨時表中以備後用。

SELECT ID, Balance, Type, CCY, Payment, Final_Balance 
INTO #AllRecords 
FROM A 
UNION 
SELECT ID, Balance, Type, CCY, Payment, Final_Balance 
FROM B 

接下來,我會GROUP BY了決定比賽的字段,然後用MINMAX獲得優先列的正確值。通過我對你的問題的理解,這意味着..

SELECT ID, MIN(Type) AS Type 
FROM #AllRecords 
GROUP BY ID 

隨着該查詢你現在對所有要在最終結果中顯示的記錄的自然鍵。剩下要做的就是使用這些鍵查找其餘列,我們可以通過將該查詢用作子查詢來完成此操作。

SELECT ID, Balance, Type, CCY, Payment, Final_Balance 
FROM #AllRecords r 
INNER JOIN (
    SELECT ID, MIN(Type) AS Type 
    FROM #AllRecords 
    GROUP BY ID) final ON r.ID = final.ID AND r.Type = final.Type 

所以一起生成的查詢是..

SELECT ID, Balance, Type, CCY, Payment, Final_Balance 
INTO #AllRecords 
FROM A 
UNION 
SELECT ID, Balance, Type, CCY, Payment, Final_Balance 
FROM B 

SELECT ID, Balance, Type, CCY, Payment, Final_Balance 
FROM #AllRecords r 
INNER JOIN (
    SELECT ID, MIN(Type) AS Type 
    FROM #AllRecords 
    GROUP BY ID) final ON r.ID = final.ID AND r.Type = final.Type 
+0

感謝您的幫助,我已設法完美地在匹配/重複記錄的位置工作。然而,查詢現在排除了只有F-CC或F-DD存在唯一記錄的任何記錄,因此我目前缺少約。來自我的數據集的10,000條記錄。道歉,如果我沒有在OP中詳細說明。 – Carlos80

+0

我相信查詢不會排除唯一記錄。只要他們有與其他任何記錄不同的ID ..您是否可以確認兩個表中沒有其他記錄具有相同的ID? – fqhv

+0

啊,我發現了它。它來自我的UNION查詢。我似乎正在拔出重複記錄,其中一個是F-CC,然後是空白的第二個記錄。當我執行MIN時,它會給我空白記錄,而不是F-CC或F-DD中獨一無二的記錄。 – Carlos80

相關問題