0

複数のテーブルを作成し、それらのデータを1つにマージしています。これらのテーブルには、類似した列col1とcol2がありますが、これらの列の値は異なる場合があります。tab1の行1のcol1は「0」であり、tab2のcol1はcol1「1」の同じ行にある可能性があります。この場合のみ、行1のcol1のtab1から値を更新する必要があります。次の例を見てください。

BEFORE MERGING               
tab1:
id col1 col2
1  0    0
2  0    1
3  0    0
                              AFTER MERGING WITH tab2
tab2:                         tab1:
id col1 col2                   id col1 col2
1  1    0           --->       1  1    0
2  0    0                      2  0    1
3  0    0                      3  0    0

そのために、次のクエリを使用します。

merge into tab1 st
   using (select id, col1, col2 from tab2) ss
   ON (st.id=ss.id)
    when matched then 
    update set  st.col1 = ss.col1,
                st.col2 = ss.col2 

  where ss.col1 != 0 or ss.col2 != 0
  when not matched then
    insert (st.id, st.col1, st.col2)
    values (ss.id, ss.col1, ss.col2)
    ; 

私はSQLを学んでいるだけなので、このクエリが正しくないことに気づきました。tab1の「1」の値をtab2の「0」で上書きできます。このクエリを改善するのを手伝ってください、私は立ち往生しています。

4

2 に答える 2

1

値を設定するときにCASE式を使用して、割り当てる値を制御できます。次のようなものを試してください:

merge into tab1 st
   using (select id, col1, col2 from tab2) ss
   ON (st.id=ss.id)
    when matched then 
    update set  st.col1 = CASE WHEN st.col1 = 0 THEN ss.col1 ELSE st.col1 END,
                st.col2 = CASE WHEN st.col2 = 0 THEN ss.col2 ELSE st.col2 END

  where ss.col1 != 0 or ss.col2 != 0
  when not matched then
    insert (st.id, st.col1, st.col2)
    values (ss.id, ss.col1, ss.col2)
    ; 

したがって、WHEN MATCHEDの状況では、tab1(st)の値がゼロの場合は、tab2(ss)の値に変更します。それ以外の場合は、tabl1の値をそれ自体に設定します。

共有してお楽しみください。

于 2013-03-26T15:50:37.707 に答える
1

最大で更新する必要があり{ss.coln, st.coln}ます。たとえば、:を使用しGREATESTます

MERGE INTO tab1 st
USING (SELECT id, col1, col2 FROM tab2) ss
ON (st.id = ss.id)
WHEN MATCHED THEN
   UPDATE
      SET st.col1 = greatest(ss.col1, st.col1), 
          st.col2 = greatest(ss.col2, st.col2)
    WHERE ss.col1 > st.col1
       OR ss.col2 > st.col2
WHEN NOT MATCHED THEN
   INSERT (st.id, st.col1, st.col2) 
   VALUES (ss.id, ss.col1, ss.col2);
于 2013-03-26T15:54:07.117 に答える