0

、、、などbookの列を持つテーブルがあります。startyearendyearauthor

次の条件に応じて、列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;

これらの2つのクエリを1つのクエリで作成するにはどうすればよいですか?

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

1 つのステートメントで複数のテーブルを更新することはできませんが、トランザクションを使用して、2 つの UPDATE ステートメントが 1 つのように扱われるようにすることができます。ラウンドトリップを避けるためにそれらをバッチ処理することもできます。

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 に答える