2017-04-20 45 views
2

我有2個表。一個是銷售表(header),另一個是銷售線(lines)。查詢結果中的存儲過程SQL

我想要做的是找出是否修改了銷售表或銷售行中的任何記錄。如果他們被修改,我想將整個銷售訂單插入到另一個表中。我使用數據庫ModifiedDateTime中的一列(銷售行中的更改不會影響salestable中的修改日期,反之亦然)。

例如 - 銷售表:

SalesID DeliveryAddress ModifiedDatetime 
    1  Street1  2017-04-20 2:00:00 
    2  Street3  2017-04-19 3:00:00 

銷售直線

SalesID ItemId Qty ModifiedDateTime 
1  100 2  2017-04-20 3:00:00 
1  101 3  2017-04-20 2:00:00 
2  100 5  2017-04-19 1:00:00 

所以我有一個存儲過程,而從這些表中選擇記錄並將其插入到其他表。它使用修改日期時間來了解哪些記錄已被修改。我想要做的是將整個訂單及其行插入到集成表中。

我現在要做的就是

Insert into IntegrationSalesTable (salesid, deliveryaddress, modifieddatetime) 
    select salesid, deliveryaddress, modifieddatetime 
    from salestable 
    where modifieddatetime > 2017-04-20 2:30:00 

而對於salesline

Insert into IntegrationSalesLine(salesid, itemid, qty, modifieddatetime) 
    select salesid, itemid, qty, modifieddatetime 
    from salestable 
    where modifieddatetime > 2017-04-20 2:30:00 

現在,我得到IntegrationSalesTable空 - 和IntegrationSalesLine有該行:

SalesID ItemId Qty ModifiedDateTime 
    1  100 2  2017-04-20 3:00:00 

我想要什麼實現:

IntegrationSalesTable:

SalesID DeliveryAddress ModifiedDatetime 
    1  Street1  2017-04-20 2:00:00 

IntegrationSalesLine:

SalesID ItemId Qty ModifiedDateTime 
1  100 2  2017-04-20 3:00:00 
1  101 3  2017-04-20 2:00:00 

我有一個想法,我需要選擇行和表中的所有修改的銷售訂單,然後使用這些數據運行查詢。但我想不出辦法做到這一點。任何建議我怎麼能達到這個結果?

+0

覺得你在做最後一個表是錯誤的。 1:00:00的銷售去哪裏了?爲什麼在2:00:00出現一個條目,當插入查詢顯式地在2:30:00之後給出一個日期時?另外,爲什麼'IntegrationSalesTable'中的字段與'SalesTable'中的格式不匹配? – antipattern

+0

也可以假設在某個日期和時間之後的所有銷售都被修改了嗎?我認爲你需要創建日期+修改日期來檢測修改的條目,否則(或包含標誌的字段) – antipattern

+0

是的,我在表結構中犯了一個錯誤。對不起,這是固定的。關於最後一張表,我想要達到的結果,但不知道如何:)當前查詢的結果高於 – user2893780

回答

0

這應該做你所需要的。它選擇了SalesID所有條目其中salesline日期尚未salestable

use testdb; 

-- This stores all the SalesID's where something changed 
DECLARE @modsalesids TABLE 
(
    SalesID INT 
) 

-- Select SalesID's where dates are different 
insert into @modsalesids(SalesID) 
select st.SalesID from salestable st 
join salesline sl on st.SalesID=sl.SalesID 
where 
-- use '<>' if you want to include _all_ changed dates, or > when you want only changes where the item list changed after the sale 
    sl.ModifiedDateTime <> st.ModifiedDateTime 


-- Remove duplicate SalesID's, make sure to keep the ';' 
; 

WITH CTE AS 
(
SELECT *,ROW_NUMBER() OVER (PARTITION BY SalesID ORDER BY SalesID) AS RN 
FROM @modsalesids 
) 

DELETE FROM CTE WHERE RN<>1 

-- Select records for the modified salesIds 
insert into integrationsalesline(SalesID, ItemId, Qty, ModifiedDateTime) 
select SalesID, ItemId, Qty, ModifiedDateTime from salesline where SalesID in (SELECT SalesID from @modsalesids); 
insert into integrationsalestable(SalesID, DeliveryAddress, ModifiedDateTime) 
select SalesID, DeliveryAddress, ModifiedDateTime from salestable where SalesID in (SELECT SalesID from @modsalesids); 

-- Debug stuff 

select * from @modsalesids; 

select * from integrationsalesline; 
select * from integrationsalestable; 

匹配的日期。如果你是好奇,這裏是source到刪除重複的部分。 這就是我建立一個測試用例:我

-- create testdb; 

--create table salestable (
-- SalesID INT, 
-- DeliveryAddress VARCHAR(200), 
-- ModifiedDateTime VARCHAR(200) 
--) 

--create table salesline (
-- SalesID INT, 
-- ItemId INT, 
-- Qty INT, 
-- ModifiedDateTime VARCHAR(200) 
--) 

--create table integrationsalestable (
-- SalesID INT, 
-- DeliveryAddress VARCHAR(200), 
-- ModifiedDateTime VARCHAR(200) 
--) 

--create table integrationsalesline (
-- SalesID INT, 
-- ItemId INT, 
-- Qty INT, 
-- ModifiedDateTime VARCHAR(200) 
--) 

--insert INTO salestable values(1,'Street1','2017-04-20 2:00:00') 
--insert INTO salestable values(2,'Street3','2017-04-20 3:00:00') 

--insert INTO salesline values(1, 100, 2, '2017-04-20 3:00:00') 
--insert INTO salesline values(1, 107, 7, '2017-04-20 3:00:00') 
--insert INTO salesline values(1, 101, 3, '2017-04-20 2:00:00') 
--insert INTO salesline values(2, 100, 5, '2017-04-20 1:00:00')