0

我想知道这种存储过程是否可行,我需要某种循环结构吗?我想这样做,基本上按照这个顺序:

  1. 从一个表或视图中获取所有行。(表格1)
  2. 基于表 1 中的列,我想设置用于插入/更新表 2 的变量。
  3. 我想引用另一个表 (table3),以从 table1 中找到一个键,该键将“覆盖”行数据可能落入的任何情况。
  4. 插入或更新表 2。

如果这是可能的,我可以在答案中获得某种草稿吗?感谢您的阅读!请尝试帮助!这是我在想的另一种“图表”:

  1. 从表 1 中选择 *
  2. case [table1].[table1column] - [table1].[table1column] <=0, parameter1= "a" (很多情况)
  3. case [table1].[tableID] 存在于table3,parameter1 = [table3].[parameter]
  4. case [table1].[tableID] 存在于 table2 中,更新,否则插入

感谢到目前为止的所有尝试!如果我弄清楚了,我会发布它。

4

3 回答 3

2

我们需要更多信息,但我会给你 98% 或更高的几率,这一切都可以在两个查询中完成(一个用于插入,一个用于更新)。

这是插入的通用示例:

INSERT INTO [Table2]
    SELECT 
        t1.[col1], /* use columns from table1 to update table2 */
        COALESCE(t3.[col2], t1.[col2]) /* table3 "overrides" table1 */
    FROM [Table1] t1 -- get all rows from table1
    LEFT JOIN [Table3] t3 ON t3.ID = t1.Table3ID
    LEFT JOIN [Table2] t2 ON t2.ID = t1.Table2ID 
    WHERE t2.OtherColumn IS NULL /* insert - only make changes where the record doesn't already exist */

和更新:

UPDATE t2
    SET t2.[col1] = t1.[col1],
        t2.[col2] = COALESCE(t3.[col2], t1.[col2])
FROM [table1] t1
LEFT JOIN [Table3] t3 ON t3.ID = t1.Table3ID
INNER JOIN [Table2] t2 ON t2.ID = t1.Table2ID /* update - only make changes where the record does already exist */
于 2009-08-13T15:14:05.397 回答
1

如果没有有关您的数据模型的更多信息,很难说,但有些情况与您描述的情况类似,无需迭代即可处理。

例如,您可以在 t1 和 t3 的左连接上进行选择,如果存在则使用 t3 值,或者使用基于 t1 列的值的表达式。这是一个粗略的示例。

insert into t2 (column list)

Select case when t3.Column is not null then t3.Column 
when t1.Column = 'somevalue' then 'someothervalue' 
else...(other conditions/values) end
...
from t1 left join t3 on t1.Key = t3.Key 

(增加有关您的具体情况的详细信息会提高您获得帮助的质量)

于 2009-08-13T15:16:22.883 回答
1

我要开枪并假设您正在谈论MS SQL Server。

是的,这种事情是可能的。这里有一些伪代码可以帮助您入门:

declare @someTable (
    idx int identity(1,1),
    column1 type,
    column2 type,
    etc type )

declare @counter

set @counter = 1

insert into @someTable (column1, column2, etc)
select column1, column2, etc from table1

while @counter < (select max(idx) from @someTable)
begin

   -- loop through records and perform logic
   insert result into table3

   set @counter = @counter + 1

end

如果可能的话……尝试使用单个查询。加入您的表并使用 Case 语句来执行逻辑。

于 2009-08-13T15:17:49.230 回答