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

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

新規登録して質問してみよう
ただいま回答率
85.48%
SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

SQL

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

Q&A

解決済

3回答

3362閲覧

2つのテーブルで、一方に存在し他方に存在しないレコードをUPDATEするSQL文

退会済みユーザー

退会済みユーザー

総合スコア0

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

SQL

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

0グッド

1クリップ

投稿2017/06/26 07:35

編集2017/06/26 08:18

2つのテーブルで、共通する2つの項目をキーとして、一方に存在し他方に存在しないレコードをUPDATEするSQL文を記載する方法を教えていただけますでしょうか?

例として、IDとシーケンス番号を含む2つのテーブルがあるとして、テーブル1に存在してテーブル2に存在しないレコードの削除フラグを1にする処理を記載するとします。

テーブル1(シーケンス番号, ID, 削除フラグ)
テーブル2(シーケンス番号, ID)

この時、テーブル1にシーケンス番号とIDの組み合わせが存在し、テーブル2には存在しないものを抽出するSQLは下記のように記載することがわかっております。

SQL

1SELECT * 2FROM テーブル1 3LEFT JOIN テーブル2 4ON テーブル1.シーケンス番号 = テーブル2.シーケンス番号 5AND テーブル1.ID = テーブル2.ID 6WHERE テーブル2.シーケンス番号 IS NULL 7AND テーブル2.ID IS NULL

このSELECTを使って、UPDATE文を記載する場合、どのようにすればよいでしょうか?

よろしくお願いします。

追記
一度、下記のように記載しましたが、コードが長くなっています。
より短くかける方法をお願いします。

SQL

1UPDATE テーブル1 2SET 削除フラグ = '1' 3WHERE テーブル1.ID IN 4( 5SELECT テーブル1.ID 6FROM テーブル1 7LEFT JOIN テーブル2 8ON テーブル1.シーケンス番号 = テーブル2.シーケンス番号 9AND テーブル1.ID = テーブル2.ID 10WHERE テーブル2.シーケンス番号 IS NULL 11AND テーブル2.ID IS NULL 12) 13AND テーブル1.シーケンス番号 IN 14( 15SELECT テーブル1.シーケンス番号 16FROM テーブル1 17LEFT JOIN テーブル2 18ON テーブル1.シーケンス番号 = テーブル2.シーケンス番号 19AND テーブル1.ID = テーブル2.ID 20WHERE テーブル2.シーケンス番号 IS NULL 21AND テーブル2.ID IS NULL 22)

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

SQL Server2008以降であればMERGEを使うのも手かと思います。
(動作未検証です)

SQL

1MERGE [テーブル1] AS T1 -- 更新テーブル 2USING [テーブル2] AS T2 -- 比較テーブル 3/* 比較条件:シーケンス番号とIDが同じ */ 4ON (T1.シーケンス番号 = T2.シーケンス番号 AND T1.ID = T2.ID) 5/* 比較条件に一致しない場合 */ 6WHEN NOT MATCHED THEN 7/* 削除フラグを立てる */ 8UPDATE SET 削除フラグ = '1';

投稿2017/06/26 12:06

N-u-u

総合スコア113

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/06/27 05:03

ありがとうございます。
guest

0

SQL

1UPDATE テーブル1 2SET 削除フラグ=1 3WHERE テーブル1.ID IN ( 4 SELECT テーブル1.ID 5 FROM テーブル1 6 WHERE NOT EXISTS ( 7 SELECT テーブル2.ID 8 FROM テーブル2 9 WHERE テーブル2.ID = テーブル1.ID AND テーブル2.シーケンス番号 = テーブル1.シーケンス番号 10 LIMIT 1 11 ) 12)

未検証です

投稿2017/06/26 08:05

Clor

総合スコア883

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/06/26 08:14

ご回答ありがとうございます。 情報が不足しておりました。 テーブル1はIDとシーケンス番号の組み合わせが一意になっており、いただいた方法ではシーケンス番号が異なっていてもIDが同じであればUPDATEされてしまいます。 申し訳ありません
guest

0

ベストアンサー

副問合せを使えば、いけそうな気がします。

再追記(not existsを使います)

SQL

1UPDATE TBL1 2SET 3 DEL = 1 4WHERE 5 NOT EXISTS ( 6 SELECT 7 * 8 FROM 9 TBL2 10 WHERE 11 TBL1.ID = TBL2.ID 12 AND TBL1.SEQ = TBL2.SEQ 13 )

更新後SQL(文字結合を使っています。SQLとしてはあまり良くないと思います)

SQL

1UPDATE TBL1 2SET 3 DEL = 1 4WHERE 5 CONCAT(TBL1.ID, TBL1.SEQ) IN ( 6 SELECT 7 * 8 FROM 9 ( 10 SELECT 11 CONCAT(TBL1.ID, TBL1.SEQ) 12 FROM 13 TBL1 14 LEFT OUTER JOIN TBL2 15 ON TBL1.ID = TBL2.ID 16 AND TBL1.SEQ = TBL2.SEQ 17 WHERE 18 TBL2.ID IS NULL 19 ) AS tmp 20 )

投稿2017/06/26 07:42

編集2017/06/26 08:36
motuo

総合スコア3027

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/06/26 07:52

ご回答ありがとうございます。 情報が不足しておりました。 テーブル1はIDとシーケンス番号の組み合わせが一意になっており、いただいた方法ではシーケンス番号が異なっていてもIDが同じであればUPDATEされてしまいます。 また、UPDATEの後にASは使えない旨のエラー(Incorrect syntax near the keyword 'AS')が出ております。 申し訳ありません。
motuo

2017/06/26 08:16

なるほど。 SQLを修正しました。少し強引ですが、IDとSQLを文字結合してぶつけています。
motuo

2017/06/26 08:33

というか、普通にexistsを使えば良かったです… すいません。さらに追記しましたのでご確認下さい。
退会済みユーザー

退会済みユーザー

2017/06/26 08:46

ありがとうございます。 とりあえず目的は果たしているコードです。 汎用的な利用を考慮したうえでBAを決定させていただきます。
退会済みユーザー

退会済みユーザー

2017/06/27 05:04

ベストアンサーとさせていただきます。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問