2012-04-26 2 views
1

У меня возникла ситуация, когда мне нужно вставить данные из таблицы1 в таблицу2. Перед установкой проверьте, существует ли определенная строка в таблице2.sql merge не будет за исключением инструкции обновления?

Условия следующие: 1) значения id и ahccs одинаковы в обеих таблицах, а затем ничего не делают. 2) значение id одинаково, но ahccs разные, затем установите флаг = 'z' и вставьте тот же идентификатор с новым значением ahccs.

Я использую SQLSERVER 2008 R2. Как я мог это достичь?

Возможно, мне понадобится нечто подобное.

DECLARE @table1 TABLE 
(id int not null, ahccs int not null, info varchar(25), flag varchar(2)) 
DECLARE @table2 TABLE 
(id int not null, ahccs int not null, info varchar(25), flag varchar(2)) 

INSERT INTO @table1 
VALUES(1, 1223, 'et', 'X') 
INSERT INTO @table1 
VALUES(2, 321, 'et', 'X') 
INSERT INTO @table1 
VALUES(3, 134, 'et', 'X') 
INSERT INTO @table1 
VALUES(4, 168, 'et', 'X') 
INSERT INTO @table1 
VALUES(5, 123, 'et', 'X') 


INSERT INTO @table2 
VALUES(1, 1223, 'dt', 'y') 
INSERT INTO @table2 
VALUES(2, 456, 'dt', 'y') 
INSERT INTO @table2 
VALUES(3, 123, 'dt', 'y') 
INSERT INTO @table2 
VALUES(4, 193, 'dt', 'y') 
--SELECT * FROM @table1 

SELECT * FROM @table2 



MERGE 
INTO @table2 t2 
USING @table1 t1 
ON  t2.id = t1.id 
WHEN MATCHED AND t2.ahccs != t1.ahccs THEN 
UPDATE 
SET  flag = 'z' 
INSERT VALUES (t2.id, t1.ahccs, t1.info, 'l'); 

два вопроса я имею являются: 1) Объединить не поддерживает несколько шагов, я считаю. 2) Обновление не допускается в КОГДА НЕ Спрятанный чехол.

Просьба сообщить.

Thank you.

+0

Необходимо указать, что вы хотите в качестве таблицы результатов на вашем примере. Конечно, это не позволяет вам «ОБНОВИТЬ», когда результаты не совпадают, потому что в какой строке вы собираетесь обновлять всю таблицу ?. Какое желательно поведение, когда строки совпадают ?, какие столбцы вам нужны для «PDATE»? – Lamak

+0

Условия: 1) значения id и ahccs одинаковы в обеих таблицах, а затем ничего не делают. 2) значение id одинаково, но ahccs разные, затем установите флаг = 'z' и вставьте тот же идентификатор с новым значением ahccs. – OBL

+0

Я обновил вопрос, допустил некоторые ошибки. – OBL

ответ

4

Я думаю, что я сейчас понимаю требования. Вы хотите обновлять записи в таблице2, где идентификатор совпадает, но ahccs нет, установив флаг в 'z'. Кроме того, для этих несоответствий новая строка должна быть вставлена ​​в таблицу2 с одним и тем же идентификатором, но ahccs из таблицы1 и флагом 'l'.

DECLARE @tmp TABLE (id int, ahccs int, info varchar(25), flag varchar(2)) 
MERGE 
INTO @table2 t2 
USING @table1 t1 
ON  t2.id = t1.id 
WHEN NOT MATCHED THEN 
    INSERT VALUES (t1.id, t1.ahccs, t1.info, t1.flag) 
WHEN MATCHED and t2.ahccs <> t1.ahccs THEN 
    UPDATE SET flag = 'z' 
output inserted.id, t1.ahccs, t1.info, inserted.flag 
into @tmp; 

insert into @table2 
select id, ahccs, info, 'l' as flag 
from @tmp 
where flag = 'z' -- don't insert what we've already inserted 
+0

Я обновил вопрос, допустил некоторые ошибки. – OBL

+0

Считаете ли вы, что это будет так? Если не согласовано, флаг для исходного идентификатора в целевой таблице будет установлен в z, а затем новые значения info и ahccs будут вставлены для одного и того же идентификатора в целевую таблицу? Спасибо! – OBL

+0

извините за путаницу. Я понимаю, что лучше, когда я продолжаю играть с ними. – OBL

Смежные вопросы