【问题标题】:sql merge wouldn't except update statement?sql合并不会除了更新语句吗?
【发布时间】:2012-04-26 15:34:55
【问题描述】:

我遇到需要将数据从 table1 插入 table2 的情况。插入前检查table2中是否已经存在某行。

条件是: 1) id 和 ahccs 的值在两个表中都是相同的,那么什么都不做。 2) id 的值相同但 ahccs 不同,然后设置 flag ='z' 并使用新的 ahccs 值插入相同的 id。

我正在使用 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) WHEN NOT MATCHED 情况下不允许更新。

请指教。

谢谢。

【问题讨论】:

  • 您需要在示例中阐明您想要的结果表。当然,当结果不匹配时,它不会让你UPDATE,因为你要更新哪一行,所有的表?行匹配时所需的行为是什么?,您需要 ÙPDATE 哪些列?
  • 条件是: 1) id 和 ahccs 的值在两个表中都是一样的,那么什么都不做。 2) id 的值相同但 ahccs 不同,然后设置 flag ='z' 并使用新的 ahccs 值插入相同的 id。
  • 我已经更新了问题,在那里犯了一些错误。
  • 您要更新源表、目标表还是两者中的flag = 'z'
  • re 2):更新对于“不匹配”没有任何意义。如果未找到任何行,则没有可以更新的内容。

标签: sql merge


【解决方案1】:

我想我现在明白了这些要求。您想更新 table2 中 id 匹配但 ahccs 不匹配的记录,将标志设置为“z”。此外,对于这些不匹配,应将新行插入到 table2 中,其 id 相同,但来自 table1 的 ahccs,并且标志为“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

【讨论】:

  • 你觉得会这样玩吗?当不匹配时,目标表中原始 id 的标志将设置为 z,然后将相同 id 的 info 和 ahccs 的新值插入到目标表中?谢谢!
  • 抱歉给您带来了困惑。随着我不断与他们一起玩,我更好地理解了需求。
  • 我认为这可以满足您的需求。当 id 和 ahccs 不匹配时,将一条匹配记录插入到 table2 中,flag = 'l' 并且 table1 被更新,因此 flag = 'z'。
  • 该标志在 table2 中也设置为 z,而不是在 table1 中。所以我们在 table2 中将 id 的旧条目设置为 void,并为相同的 id 添加一个新条目。
  • 条件是: 1) id 和 ahccs 的值在两个表中都是一样的,那么什么都不做。 2) id 的值相同但 ahccs 不同,然后设置 flag ='z' 并使用新的 ahccs 值插入相同的 id。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多