2009-07-06 41 views
0

我有兩個表,第一部分概括的結構中,可以迭代第二的結構:插入表的另一個表的一部分

table1 (id, i, j, k, a, b, c, x, y, z) -- requests 
table2 (id, a, b, c, d) -- essential elements/bank subjects 

我需要從table2與插入table1一個記錄給定ID。 這樣做的最佳方法是什麼?

我有兩個想法:

1:

DECLARE @a type, @b type, @c type 
SELECT @a = a, @b = b, @c = c, FROM table2 WHERE id = @id 
INSERT INTO table1 (i, j, k, a, b, c, x, y, z) 
VALUES (@i, @j, @k, @a, @b, @c, @x, @y, @z) 

2:

CREATE TABLE #result (a type, b type, c type) 
SELECT a, b, c INTO #result FROM table2 WHERE id = @id 
INSERT INTO table1 (i, j, k, a, b, c, x, y, z) 
    VALUES (@i, @j, @k, 
    (SELECT a FROM #result), 
    (SELECT b FROM #result), 
    (SELECT c FROM #result), 
    @x, @y, @z) 

什麼其他方法確實存在?哪一個是最佳做法?

+0

那些似乎是很好的方式來做到這一點,怎麼了? – rball 2009-07-06 22:03:57

+0

我只想找到最好的一個。並瞭解這種選擇的原因。瞭解更多關於這個話題。 – abatishchev 2009-07-06 22:09:55

回答

6

我會做這樣的:

INSERT INTO table1 (i, j, k, a, b, c, d, x, y ,z) 
Select @i, @j @k, a, b, c, d, @x, @y, @z 
From table2 
Where id = @id 

這樣可以節省你從局部變量和/或臨時表獲取數據。表現應該更好。

要實現的重要部分是您可以在select中硬編碼值。列出列(插入行)的順序必須與列出選擇行中列的順序相匹配。

2

您可以用單一插入查詢做到這一點:

insert into table1 (a, b, c, d, x, y, z) 
select a, b, c, d, @x, @y, @z 
from table2 
where id = @id 

編輯:
隨着你加入了一個額外的領域將是:

insert into table1 (i, j, k, a, b, c, x, y, z) 
select @i, @j, @k, a, b, c, @x, @y, @z 
from table2 
where id = @id 
+0

我已經編輯了我的文章了一下。敬請期待。如果table1包含來自table2的列,那麼您的解決方案是否可以工作? – abatishchev 2009-07-06 22:08:38

1

如果您在識別插入哪些數據時遇到問題,臨時表可能會有益於開發過程。如果您需要執行其他「需要」光標循環查看記錄的數據更改,它也可能很有用。

否則,它只是您添加字段時必須更新的代碼的另一部分。

相關問題