質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.76%

  • SQL

    2228questions

    SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

  • Hive

    45questions

    Hiveとは、Hadoop(オープンソースの大規模分散計算フレームワーク)の上で動作するDWH(Data Warehouse:データウエアハウス)向けのプロダクトです。HiveQLというSQLのような言語で、Hadoop上のデータを操作することができます。

SQL:条件の結果をすでに存在するテーブルにINSERTする方法

受付中

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 131

fuusuke

score 4

環境:Hadoop(HDFS)環境
言語:hive

以下2つ(t1,t2)のテーブルが存在するとします。
DESC t1;
name_id INT

・t1のデータ例
name_id 
1
3
5
7
9

DESC t2;
name_id INT
department STRING

・t2のデータ例
name_id department
1    財務部
2    人事部
3    営業部
4    開発部
5    広報部

t1にt2の情報を追加したい場合、どのようなクエリを書けば良いでしょうか?
・期待する結果(t1)
name_id department
1       財務部
3     営業部
5        広報部
7        NULL
9        NULL

私はこれまでt3テーブルをCREATEして、t1とt2をJOIN(on name_id)したものをt3にINSERTしていたのですが、
もしt3を作成せずにt1テーブルに拡張できる方法があればご教示いただきたいです。

おそらく、まずALTER TABLEでdepartmentカラムを追加した上で、
INSERT INTO? か何かで挿入できるのではないかと想定しています。

初心者ですみませんが、よろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

0

t2にあって、t1に存在しないname_idのデータをt1にinsertします。

alter table t1 add department STRING; 
insert OVERWRITE t1(対象のカラム,・・・)
select t2.対象カラム,・・・
from t2
where not exists(
        select 1 from t1 where name_id=t2.name_id
      )
;

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/29 01:33

    >sazi様
    回答いただきありがとうございます。
    ただ、私の質問の仕方がよくなかったようで、ご回答はこちらの意図している回答ではないようです。
    申し訳ありませんでした。。質問文を修正いたしました。
    再回答いただけますと大変助かります。よろしくお願いいたします。

    キャンセル

  • 2018/06/06 22:43

    どういった点が意図しない点でしょうか?
    SQL自体はサンプルでもあり実行していないので、エラーなのかもしれませんが。

    キャンセル

0

バージョンやトランザクションの設定によって動かない可能性はあるようですが、MERGE文で対応可能ではありませんか?

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DML#LanguageManualDML-Merge

t1テーブルにdepartmentカラムが追加されている前提で、サンプルコードを提示してみます(動作未検証のため、調整が必要かもしれません)。

MERGE INTO t1 USING t2
ON t1.name_id = t2.name_id
WHEN MATCHED THEN UPDATE SET t1.department = t2.department -- on句の条件にMATCHしたらUPDATE
WHEN NOT MATCHED THEN INSERT VALUES (t2.name_id, t2.department) -- on句の条件にMATCHしなかったらINSERT
;

(2018/06/13追記)
chelsy7110さんの回答を拝見し、改めて 期待する結果(t1) を見てみました。
t2にしか存在しないレコードをt1にINSERTする必要はなく、t1の既存レコードのdepartmentがUPDATEできれば良いのですね(すみません、質問を若干勘違いしておりました)。
その場合、上記コードの WHEN NOT MATCHED ~ 以降を削除していただければ、期待した動作になるのではないかと思われます。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

期待する結果からすると

update t1 set department = (select department from t2 where name_id = t1.name_id)


これでいいんじゃないでしょうか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.76%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    【SQLite】複数カラムのデータをまとめて対象としてソートする。

    SQLiteで例えば | 名前 | 国語の点数 | 数学の点数 | 社会の点数 | 理科の点数 | 英語の点数 | のようなテーブルがあったとします。 このようなテーブルで、

  • 受付中

    Mysql 重複している行を削除したい

    現在運営しているサービスのあるテーブルには、約100万行以上あります。 このテーブルから重複している行を削除したいのですが良い方法ありますでしょうか? カラムにはid name 

  • 解決済

    【php】mysqlであるカラムが空文字のデータを取り出す方法

    初歩的な質問ですいません。一言掲示板を作っています。 以下のようなデータを使って、 SELECT comments.*, members.id, members.name,memb

  • 受付中

    1つのテーブルからデータをコピーしたい

    かなり初心者です。 insertとselectを使って 他のテーブルからデータをもってきてコピーする方法があるのを知ったのですが、 1つのテーブルがあって、その中のデータをコピー

  • 解決済

    mysqlの外部キー制約について

    create table test_table_1(     id int(11) not null,     name varchar(30) not null,     pri

  • 解決済

    postgresのデータ取得時間を短縮したい

    タイトルの通りpostgresからデータを取得する時間を短縮したいです。 以前にも質問させていただいたのですが、前回とは少し内容が変わっております。 テーブルには2700万

  • 解決済

    データベースから最新のデータを取り出す

    Mysqlでデータベースにデータを入れた後、格納されたデータの中で最新のデータを呼び出したい時にはどのような方法がありますでしょうか? ご教示いただけますと幸いです。 ちな

  • 解決済

    DBに保存できない..

    Chat形式のメッセージ内容をDBに保存するため下記のPHPを記載しています。テーブルtbl_messagesにarrayの内容をinsertしたいのですが、実行してもDBに保存さ

同じタグがついた質問を見る

  • SQL

    2228questions

    SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

  • Hive

    45questions

    Hiveとは、Hadoop(オープンソースの大規模分散計算フレームワーク)の上で動作するDWH(Data Warehouse:データウエアハウス)向けのプロダクトです。HiveQLというSQLのような言語で、Hadoop上のデータを操作することができます。