2017-07-21 6 views
1

私は、データベースDB1でテーブルTab1をを持っている:更新列

col1 | col2 
-------------- 
'abc-1' | 11 
'abc-2' | 22 
'abc-3' | 33 
null | 44 
null | 55 

私はデータをこのテーブルからCOL1列を更新したいです

col3 | col4 | col5 
--------------------- 
'abc-1' | 1 | 10 
'abc-1' | 2 | 10 
'abc-2' | 1 | 20 
'abc-3' | 1 | 30 
'abc-3' | 2 | 30 
'abc-3' | 3 | 30 
'abc-4' | 1 | 40 
'abc-5' | 2 | 60 

(COL1内のデータは常にだけCOL3から来ています。)

:列COL3から別のデータベース(DB2)内の別のテーブル( TAB2)から

テーブルは2つの中間テーブルDB1によって接続されています。 TAB3

col6  | col7 
---------------- 
'abc-001' | 11 
'abc-002' | 22 
'abc-003' | 33 
'abc-004' | 44 

およびDB2。 TAB4

col8 | col9 
---------------- 
10 | 'abc-001' 
20 | 'abc-002' 
30 | 'abc-003' 
40 | 'abc-004' 
50 | 'abc-005' 

、COL3値は、(ID値によって識別された状態で)繰り返すことができる、これはトリッキーな部分です。 COL1に欠けているすべての値がCOL3に繰り返さないと仮定すると、これは私が列を更新する方法である:

update DB1.Tab1 as T1 
     inner join 
    DB1.Tab3 as T3 ON T3.col7 = T1.col2 
     inner join 
    DB2.Tab4 as T4 ON T4.col9 = T3.col6 
     inner join 
    DB2.Tab2 as T2 ON T2.col5 = T4.col8 
set 
    T1.col1 = T2.col3 
where 
    T1.col1 is null; 

また、これは、一般的に繰り返される値のために動作します - しかし、私は唯一のCOL3値がやるときCOL1を更新したいです繰り返さない、つまりこの場合は値abc-2、abc-4、abc-5を使用します。これは私が(アップデートに関連する)単一col3という値を選択する方法である:

select 
    col3 
from 
    DB2.Tab2 as T2 
     inner join 
    DB2.Tab4 as T4 ON T2.col5 = T4.col8 
     inner join 
    DB1.Tab3 as T3 ON T4.col9 = T3.col6 
     inner join 
    DB1.Tab1 as T1 ON T3.col7 = T1.col2 
where 
    T1.col1 is null 
     and T1.col2 is not null 
group by col3 
having count(*) = 1; 

質問です:どのように私は繰り返さないcol3という値でCOL3でCOL1を更新していますか?


EDIT。

しかし、すべての空のcol1値は、選択クエリの結果の最初のcol3値のみで更新されます。 where句には何かがないと思うが、適切な条件を立てることはできない。

答えて

0

解決策を見つけました。問題は非常に複雑でしたが、それを考えた後、答えは簡単であることが判明しました。

私のupdateselectステートメントとwhere句には、ほとんど問題なく動作しました。

update DB1.Tab1 as T1, 
    (select 
     col3, T1.col2 as T1c2 
    from 
     DB2.Tab2 as T2 
    inner join DB2.Tab4 as T4 ON T2.col5 = T4.col8 
    inner join DB1.Tab3 as T3 ON T4.col9 = T3.col6 
    inner join DB1.Tab1 as T1 ON T3.col7 = T1.col2 
    where 
     T1.col1 is null 
      and T1.col2 is not null 
    group by col3 
    having count(*) = 1) as T2d 
set 
    T1.col1 = T2d.col3 
where 
    T1.col1 is null 
     and T1.col2 = T1c2; 

溶液ダウン更新するテーブルからさらに別のカラム(T1.col2)を選択するようになり、特にT1.col1を更新する必要のある値は、次いで、以前に各T1.col2比較選択されたもの。

しかし、その背後にあるメカニズムは明らかではない、具体的にはupdateこの編集なしのステートメントはすべてのフィールドを1つの値で更新するため、コメントはまだ評価されます。