2012-02-28 5 views
1

私はタイトルから聞きたいことを理解していないかもしれませんが、ここにその説明があります。既存の行をコピーして挿入することはできますが、1つの列を変更するSQL文はありますか?

私はOracleデータベーステーブルにデータを持っています。私がしたいのは、テーブルに新しいデータを挿入することです。この新しいデータは既存のデータに基づいていますが、1つの列の値を変更する必要があります。したがって、挿入後にデータベースに10行がある場合は、20行ありますが、新しい10行には列上を除いて同じデータが含まれます。

挿入前

例えばテーブルに新しいデータを挿入した後

Col1 Col2 Col3 

    a  b  AA 

    1  2  33 

テーブル

Col1 Col2 Col3 

    a  b  **BB** 

    1  2  **44** 
+1

この新しい列の値はどのように指定しますか?彼らはどこから来たの? – pedromarce

+1

これは、データを変更する具体的な方法によって異なります。標準のOracle SQL関数を使用して古いデータから新しいデータを計算*することができれば、単純な解決策があります。変更がカスタムの場合、かなり複雑な解決策があります。 – dasblinkenlight

+0

ああ、その質問にハードコードされることになる。私はAAからBBまでCol3を変更したいと言います。だからクエリで私は言うだろう... Col3 = BB .... – WowBow

答えて

4

は、新しい値がどうあるべきかエンコードすることができることを提供する新しいデータ。はい。

INSERT INTO 
    myTable (
    Col1, 
    Col2, 
    Col3 
) 
SELECT 
    Col1, 
    Col2,    -- This is a specific example based on your comment. 
    Col3 + 6   -- This just adds 6 to the existing value, but any SQL 
FROM     -- could actually go here, such as a CASE statement... 
    myTable 

したがって、問題は次のようになります。 Col3の新しい値を計算するためにSQLで実装できるルールはありますか?ルールは基本的なもののような...

CASE WHEN Col3 = 'AA' THEN '**BB**' 
    WHEN Col3 = '33' THEN '**44**' 
         ELSE 'Unknown' 
END, 

それとも、別のテーブル内のすべての新しい値を持っており、参加...

INSERT INTO 
    myTable (
    Col1, 
    Col2, 
    Col3 
) 
SELECT 
    OldTable.Col1, 
    OldTable.Col2, 
    COALESCE(NewTable.Col3, 'Unknown') 
FROM 
    myTable  AS OldTable 
LEFT JOIN 
    lookup  AS NewTable 
    ON OldTable.Col1 = NewTable.Col1 
    AND OldTable.Col2 = NewTable.Col2 
を使用してそれらを見ることができるかもしれない


または他のオプションの全体の束。

+0

私はもう1つのことをするだけです。列の1つに値6(数値フィールド)を追加する。私はどうしたらいいですか? – WowBow

+0

@MatX - 具体的に 'Col3 + 6'を表示するように更新された例 – MatBailie

+0

私はそれを感謝します。 – WowBow

4

どのようにデータを変更するかによって決まります。たとえば、AABBになるか、または33がになるはずですか?

あなたが投稿した2つのケースでは、このようなものが動作します。 CASEステートメントを変更して、新しい値を別々に計算することで、任意のルールに適合させることができます。

INSERT INTO table_name(col1, col2, col3) 
    SELECT col1, 
     col2, 
     (CASE WHEN col3 = 'AA' 
       THEN 'BB' 
       WHEN col3 = '33' 
       THEN '44' 
       ELSE null 
      END) 
    FROM table_name; 
+0

ありがとうございます。 – WowBow

関連する問題