0

我有一个表,其中包含bookstartyearendyear等列author

我需要根据以下条件同时更新startyear和列,endyear

STARTYEAR = ENDYEAR where STARTYEAR=0 and ENDYEAR != 0 
also
ENDYEAR = STARTYEAR  where ENDYEAR =0 and STARTYEAR != 0 

这是可能的

UPDATE Table SET STARTYEAR = ENDYEAR WHERE STARTYEAR=0 AND ENDYEAR<>0; 
UPDATE Table SET ENDYEAR = STARTYEAR  WHERE ENDYEAR =0 AND STARTYEAR<>0;

如何在一个查询中编写这两个查询?

4

5 回答 5

3
update table
set 
startYear = case when startyear = 0 and endyear<>0 then endyear else startYear end,
endYear = case when endyear = 0 and startyear <> 0 then startyear else endYear end
where startyear = 0 or endyear = 0;
于 2013-02-06T07:30:58.383 回答
3

另一种方法是:

UPDATE Table 
SET STARTYEAR = STARTYEAR + ENDYEAR
  , ENDYEAR   = STARTYEAR + ENDYEAR
WHERE STARTYEAR = 0 AND ENDYEAR <> 0
   OR ENDYEAR = 0 AND STARTYEAR <> 0 ; 

但我真的没有看到这样做的任何理由。您可以在事务中使用您拥有的 2 语句方式。它甚至可能比任何复杂的单一语句更有效。

于 2013-02-06T07:41:59.107 回答
1

您可以使用或更新机器人字段,除非您有触发器阻止您在 startyear = endyear = 0 的情况下执行此操作;

UPDATE Table SET STARTYEAR = STARTYEAR+ ENDYEAR, ENDYEAR = STARTYEAR+ENDYEAR WHERE STARTYEAR=0 OR ENDYEAR=0
于 2013-02-06T07:32:33.113 回答
0

您不能在一个语句中更新多个表,但是,您可以使用事务来确保将两个 UPDATE 语句视为一个。您还可以对它们进行批处理以避免往返。

BEGIN TRANSACTION

UPDATE Table SET STARTYEAR = ENDYEAR WHERE STARTYEAR=0 AND ENDYEAR<>0; 

UPDATE Table SET ENDYEAR = STARTYEAR  WHERE ENDYEAR =0 AND STARTYEAR<>0;

COMMIT

但在你的情况下,你也可以使用类似这篇文章中的答案。

于 2013-02-06T07:32:55.313 回答
0

这应该工作,

update test
   set startyear = (case when startyear = 0 AND endyear <> 0 then endyear else startyear end),
       endyear   = (case when endyear = 0 AND startyear <> 0 then startyear else endyear end);
于 2013-02-06T07:37:13.283 回答