我需要將內容從一個表格複製到它自己和相關表格......讓我對這個問題進行模式化。假設我有兩個表格:在TSQL中複製內容
隨着PK自動增量。
假設我想將一個客戶的內容複製到另一個客戶的內容。我如何有效地做到這一點?
問題是PK。我需要將OrderIDs
的值從原始數據集映射到副本,以便在OrderItem
中創建適當的引用。如果我只選擇插入,我將無法創建該地圖。
對此提出建議?
我需要將內容從一個表格複製到它自己和相關表格......讓我對這個問題進行模式化。假設我有兩個表格:在TSQL中複製內容
隨着PK自動增量。
假設我想將一個客戶的內容複製到另一個客戶的內容。我如何有效地做到這一點?
問題是PK。我需要將OrderIDs
的值從原始數據集映射到副本,以便在OrderItem
中創建適當的引用。如果我只選擇插入,我將無法創建該地圖。
對此提出建議?
您是否必須將表A中的主鍵作爲表B中的主鍵?如果沒有,你可以做一個插入到一個選擇語句。主鍵通常是從不斷增加的種子(身份)開始的int。回顧一下,並且聲明插入這些相同的數據會產生問題,因爲有人認爲這是在此表上設置的明確密鑰,而不是「關係」或外鍵值。
您可以選擇主鍵以插入其他表格,但不是自己....除非您設置'身份插入'提示。除非你知道這是什麼,否則不要這樣做,因爲如果你不瞭解分支,你可以創造更多的問題,而不是它的價值。
我只想做奧萊:
插入到表B 從表A 其中選擇* (標準)
簡單的例子(假設SQL Server 2008或更高版本)。我的錯我沒有看到你沒有列出TSQL框架。不知道這是否會在Oracle或MySql上運行。
declare @Order Table (OrderID int identity primary key, person varchar(8));
insert into @Order values ('Brett'),('John'),('Peter');
declare @OrderItem Table (orderItemID int identity primary key, OrderID int, OrderInfo varchar(16));
insert into @OrderItem
select
OrderID -- I can insert a primary key just fine
, person + 'Stuff'
from @Order
select *
from @Order
Select *
from @OrderItem
從
訂單ALTER TABLE順序添加OldOrderID INT NULL
刪除多餘的輔助柱INSERT INTO訂單(客戶ID,ORDERNAME,OldOrderID) SELECT @NewCustomerID,ORDERNAME,ORDERID FROM 訂單WHERE客戶id = @OldCustomerID
INSERT INTO OrderItem的(訂單ID,數量) SELECT o.OrderID島數量 從訂單o INNER JOIN訂購商品i ON o.OldOrderID = i.OrderID WHERE o。客戶id = @NewCustomerID
更新訂單SET OldOrderID = NULL WHERE OldOrderID IS NOT NULL
ALTER TABLE訂單DROP COLUMN OldOrderID
我忘了提及這不是一次性的,而是一個應用程序中的'正常'(儘管有點罕見)事件。我可以將列留在那裏,但是對架構有點污染。 –
@ Vincent-Philippe Lauzon - 答案中的代碼刪除(刪除)額外的列。您可以使用臨時表而不是更改表,但這是最簡單的解決方案。 –
IF的OrderName
爲每個客戶獨特的,你可以簡單地做:
INSERT INTO [Order] ([CustomerID], [OrderName])
SELECT
2 AS [CustomerID],
[OrderName]
FROM [Order]
WHERE [CustomerID] = 1
INSERT INTO [OrderItem] ([OrderID], [Quantity])
SELECT
[o2].[OrderID],
[oi1].[Quantity]
FROM [OrderItem] [oi1]
INNER JOIN [Order] [o1] ON [oi1].[OrderID] = [o1].[OrderID]
INNER JOIN [Order] [o2] ON [o1].[OrderName] = [o2].[OrderName]
WHERE [o1].[CustomerID] = 1 AND [o2].[CustomerID] = 2
否則,您將不得不使用臨時表或更改現有的Order
表像@LastCoder建議。
對於複製一個家長和許多兒童的身份作爲鑰匙,我覺得OUTPUT
子句可以讓事情變得很乾淨(SqlFiddle here):
-- Make a duplicate of parent 1, including children
-- Setup some test data
create table Parents (
ID int not null primary key identity
, Col1 varchar(10) not null
, Col2 varchar(10) not null
)
insert into Parents (Col1, Col2) select 'A', 'B'
insert into Parents (Col1, Col2) select 'C', 'D'
insert into Parents (Col1, Col2) select 'E', 'F'
create table Children (
ID int not null primary key identity
, ParentID int not null references Parents (ID)
, Col1 varchar(10) not null
, Col2 varchar(10) not null
)
insert into Children (ParentID, Col1, Col2) select 1, 'g', 'h'
insert into Children (ParentID, Col1, Col2) select 1, 'i', 'j'
insert into Children (ParentID, Col1, Col2) select 2, 'k', 'l'
insert into Children (ParentID, Col1, Col2) select 3, 'm', 'n'
-- Get one parent to copy
declare @oldID int = 1
-- Create a place to store new ParentID
declare @newID table (
ID int not null primary key
)
-- Create new parent
insert into Parents (Col1, Col2)
output inserted.ID into @newID -- Capturing the new ParentID
select Col1, Col2
from Parents
where ID = @oldID -- Only one parent
-- Create new children using the new ParentID
insert into Children (ParentID, Col1, Col2)
select n.ID, c.Col1, c.Col2
from Children c
cross join @newID n
where c.ParentID = @oldID -- Only one parent
-- Show some output
select * from Parents
select * from Children
賓果!這就是我正在尋找的動態構建映射。以前從未聽說過這個'輸出條款'。從未見過SQL小提琴!謝謝! –
很高興聽到。請註冊並/或標記爲答案以幫助未來的訪客。此外,@MikaelEriksson擁有與多位家長合作的良好鏈接。 –
您可以使用臨時表和存儲PROC到確實解決了這個問題。 – Hiten004
哪個版本的SQL Server/Sybase? –
每個客戶的訂單名稱是否唯一?那麼,客戶是否有多個具有相同OrderName的訂單? – Jacco