Join

聯合後如何對行進行排序

  • November 14, 2021

我有兩個要合併的表。

在此處輸入圖像描述

我需要能夠顯示與原始(記錄 1)相比發生變化的所有 DelDates。記錄 1 作為第一條記錄,記錄 0(表 2)始終是最後一條記錄。

結果應該是:

在此處輸入圖像描述

我是 SQL 新手,根據我的研究,我似乎需要使用 UNION 來連接兩個表並自己加入新表(來自 Union)。當我嘗試這樣做時,它創建了重複的行和列。

你是對的 - 如果你有兩個具有相同列的數據集,那麼 UNION 是將第二個數據集附加到第一個數據集的正確方法。此外,我建議您使用 UNION ALL。UNION 本身保證輸出中的唯一值。通常這需要排序和進一步處理來檢測和消除重複。在您的情況下,我認為您沒有重複項,因此 UNION ALL 是合適的。

真正的問題似乎是排序順序。您希望組合數據集按 Record 排序,但最後一項為 0。這些行存在於兩個塊中:零行和其他行。如果我們為每個分配一個“塊編號”,則可以對它們進行相應的排序。顯然,這不能通過更改 Record 本身來實現,因此必須引入另一列。這個新的人工列不需要從查詢中返回。

你沒有提到你使用哪個 DBMS。我手頭有 SQL Server;我會用它。對於未來的問題,請不要包括數據的螢幕截圖。我很難重現您的情況。而是在問題中包含重現測試案例所需的 CREATE 和 INSERT 以及您嘗試過的查詢以及為什麼不起作用。見mcve。我已經寫了最低限度來展示建議的解決方案。

drop table if exists Table1;
drop table if exists Table2;
go

create table Table1(Name varchar(9), Record int); -- other columns omitted for simplicity
create table Table2(Name varchar(9), Record int);
go

insert Table1 values ('Joy', 1), ('Joy', 2);
insert Table2 values ('Joy', 0);
go


-- I've written this as a Common Table Expression (CTE). A sub-query would work just as well
;with Data as
(
select
   Name, Record, BlockNumber = 2   -- BlockNumber for Table2 is greater than that for Table1
from Table2  -- the order of queries within the CTE does not affect the output

union all

select
   Name, Record, BlockNumber = 1
from Table1
)
select 
   Name, Record -- note that BlockNumber is not returned
from Data
order by
   Name,           -- the leading column of the sort so one person's rows all appear together
   BlockNumber,    -- will put Table2's row after Table1's.
   Record;         -- since all Table1's rows are in the same block they'll sort by Record

我使用**max(record +1)**使 0 始終是最後一條記錄。

現在,我需要將行與上面的行進行比較,並在delDate不同時寫入記錄。它應該只適用於同一個ID

這是我的查詢:

select 
       T1.ID,
       T1.Code,
       T1.Name,
       T1.DelDate,
       T1.UpdateDate,
       (select 
           max(Record)+1
           from Table2 (nolock)
           where 
           ID = T1.ID
           and Code = T1.Code
           ) Record
       from Table1 T1
   Union 
       select 
       T0.ID,
       T0.Code,
       T0.Name,
       T0.DelDate,
       T0.UpdateDate,
       T0.LogInstanc
       from Table2 T0

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