2016-01-19 31 views
2

我有以下代碼:如何保持插入到表的行與源SELECT子句之間的關係?

DECLARE @NewTenant INT = ...; 
DECLARE @TemplateTenant INT = ...; 
CREATE TABLE FooTable(FooID INT PRIMARY KEY IDENTITY(1,1), TenantID INT REFERENCES ..., SomeData XML) 

INSERT INTO FooTable(TenantID, SomeData) 
SELECT @NewTenant, SomeData FROM FooTable 
WHERE TenantID = @TemplateTenant 
ORDER BY FooID; 

我需要填寫以下表格:

CREATE TABLE #FooTableOldNew(TemplateTenantFooID INT, NewTenantFooID INT); 

我想通幾個方法可以做到這一點,但他們都似乎是unnecesary詳細,如:

SELECT Old.FooID OldFooID, New.FooID NewFooID 
INTO #FooTableOldNew 
FROM (SELECT FooID, ROW_NUMBER() OVER (ORDER BY FooID) as RowNumber FROM FooTable WHERE TenantID = @TemplateTenant) Old 
INNER JOIN (SELECT FooID, ROW_NUMBER() OVER (ORDER BY FooID) as RowNumber FROM FooTable WHERE TenantID = @NewTenantID) New 
ON Old.RowNumber = New.RowNumber 

當粘貼相同的代碼時,至少有4行代碼和很大的錯誤風險。

+1

說實話:我不明白你的問題...我的理解是,您希望根據您選爲「TemplateTenant」的舊線條創建新線條。將TemplateTenantID列放在FooTable(自引用)中並避免使用「OldNew-Table」可能是一個暗示。所有這些信息比寫入依賴表更容易查詢。 – Shnugo

+0

您可以請解釋一下更多 – Moumit

+0

@Shnugo:我不想將TemplateTenantID放置在〜20表中,只是爲了簡化一個很少使用的存儲過程。是的,可以在SP中添加列並在執行過程後將其刪除,但不是矯枉過正? – Ginden

回答

0

無須維護行之間的關係,因爲你逝去的新舊Tenantid作爲參數,所以你可以簡單地使用子查詢相同:

CREATE TABLE #FooTableOldNew(TemplateTenantFooID INT, NewTenantFooID INT); 
INSERT INTO #FooTableOldNew 
select (select FooID FROM FooTable Where [email protected]) as Old, 
(select FooID FROM FooTable Where [email protected]) as New 
from FooTable Where TenantID = @TemplateTenant 
+0

不合理的答案 - 不適用於多行。 – Ginden

+0

根據您發佈的查詢,將只返回單行,因爲您已經提出了'@TemplateTenant'和'@NewTenant'的where條件,因此它表明您只想要單行答案,如果不是,那麼請解釋 – Hardik

+0

TenantID isn在FooTable中不是唯一的,它並不是暗示的。 – Ginden