2009-08-13 2 views
0

Я хотел бы знать, возможна ли такая хранимая процедура, нужна ли мне какая-то структура циклов или что-то в этом роде? Я хочу сделать это, в основном в таком порядке:Сохраненная процедура, которая выбирает, условия, устанавливает переменные, а затем вставляет/обновляет в таблицу

  1. получить все строки из одной таблицы или просмотра. (table1)
  2. на основе столбцов таблицы 1, я хочу установить переменные для использования в таблице insert/update2.
  3. Я хочу ссылаться на другую таблицу, (таблицу3), чтобы найти ключ из таблицы1, который будет «переопределять», любые случаи, в которые могут попадать данные строки.
  4. Вставьте или обновите таблицу2.

Если это возможно, могу ли я ПОЖАЛУЙСТА получить какой-то сквозняк в ответе? Спасибо, что прочитали! PLZ попытаться помочь! Вот еще бы- "Диаграмма", что я имею в виду:..

  1. select * from table1
  2. случай [table1] [table1column] - [table1] [table1column] < = 0, параметра 1 = "a" (много случаев)
  3. case [table1]. [tableID] Существует в таблице3, parameter1 = [table3]. [parameter]
  4. case [table1]. [tableID] Существует в таблице2, update, else вставка

Спасибо за все попытки если я это выясню, я опубликую его.

+1

Какие РСУБДы?MySQL? SQL Server? –

+0

Можете ли вы рассказать о своем вопросе по-другому? Мне сложно понять цель каждого шага, особенно шаг 3. Добавление немного более подробной информации также поможет дать вам более конкретный ответ. –

+0

Рассматривали ли вы это в одном выражении SQL? Основываясь на вашем описании, для этого может не понадобиться хранимая процедура с циклом, в зависимости от деталей того, что вам нужно делать. – Chi

ответ

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 для выполнения логики.

+0

, хотя это было бы проблематично, петля - плохая идея и ее не следует поощрять. Решение на основе набора будет лучше. – HLGEM

+0

Вот что я предлагаю ... вам просто нужно сделать это до конца сообщения. –

+0

Я собираюсь выбрать это. У меня его нет полностью, но я собираюсь начать с этого цикла ... Его сосут, пока я не выясню, как сделать все это в одном запросе – Marlon

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 */ 
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 

(увеличение подробно о вашей конкретной ситуации повышает качество помощи вы получаете)