Join
聯合後如何對行進行排序
我有兩個要合併的表。
我需要能夠顯示與原始(記錄 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