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

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

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

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

SQL

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

Q&A

解決済

3回答

6155閲覧

再投稿 AテーブルとBテーブルの比較

DENQ

総合スコア19

SQL Server

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

SQL

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

0グッド

0クリップ

投稿2016/07/20 10:11

編集2016/07/21 04:24

テーブル構成が同じのAとBの比較をしたいです。
テーブル構成としてはこんな感じです。
CREATE TABLE TBL_A (
ID [int] PRIMARY KEY,
NO [int] PRIMARY KEY,,
NAME nchar,
KOSHIN_DATE [datetime],


timestamp [timestamp]
)

Bテーブルも同じ構成です。

timestampにはバイナリデータが入っているのでtimestampを除いた
テーブル内のKOUSHIN_DATE と TIMESTAMPを除いた全カラムを比較してAテーブルの更新日が9/23以前かつ、カラムの値が違うIDを抽出したいです。(ひとつでもカラムの値がちがければ対象)
その上で、Bテーブルから差分のあるカラムの値をAテーブルにUPDATEしたいです。
もしくは、抽出されたIDをBテーブルIDの行を全てAテーブルにUPDATEする手法でも可。
その時にKOSHIN_DATEをその日の日付をUPDATEしたいです。
その後、更新しなかったIDを抽出する。
ここまでの手順のSQLをご教授いただけないでしょうか。
長くなりますが、よろしくお願いします。

最初に比較だけでもできればと思い、下記のSQLを書いてみましたが、GROUP BYの部分でエラーが出てしまいました。

SELECT [ID] From (
SELECT ID
, NO
, NAME
, KOSHIN_DATE
(以下カラム略)


FROM A_table
UNION
SELECT ID
, NO
, NAME
, KOSHIN_DATE
(以下カラム略)


FROM B_table
)
GROUP BY [ID]
HAVING COUNT(*) = 2

もしよければSQLを教えていただければ、幸いです。

参考にしたサイトです。
http://www.projectgroup.info/tips/SQLServer/SQL/SQL000004.html
http://oshiete.goo.ne.jp/qa/5466761.html
http://d.hatena.ne.jp/CAMUS/20060111/1136984749

よろしくお願いします。

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

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

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

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

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

guest

回答3

0

自己解決

visual studioからデータを選択して、データの比較で比較するDBのテーブルを選択。
差分のあるデータが出てくるので、その後ファイルにエクスポートすれば
自動で差分があるデータのUPDATE文を作成する事で解決できました。

sqlで差分を出し、出てきた差分のデータをUPDATEするというスクリプトを書きたかったのですが、
上記の方法で対応ができましたので、報告いたします。
皆さま、回答ありがとうございました。

投稿2016/07/21 09:18

DENQ

総合スコア19

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

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

0

IDとNOはともにPRIMARYとなっていますが
IDがPRIMARYでNOはユニークと考えればよいですか?
それともIDがPRIMARYでNOはだたのINTでしょうか?

追記

ごめんなさいMySQLの例です

SQL

1CREATE TABLE tbl_A (ID INT NOT NULL ,NO INT NOT NULL, NAME VARCHAR(10), KOSHIN_DATE datetime,timestamp timestamp,PRIMARY KEY(ID,NO)); 2INSERT INTO tbl_A(ID,NO,NAME,KOSHIN_DATE) VALUES(1,100,'hoge','2016-07-21 01:00:00'),(1,200,'hoge','2016-07-21 02:00:00'),(2,200,'hoge','2016-07-21 02:00:00'),(3,300,'hoge','2016-07-21 03:00:00'); 3CREATE TABLE tbl_B (ID INT NOT NULL ,NO INT NOT NULL, NAME VARCHAR(10), KOSHIN_DATE datetime,timestamp timestamp,PRIMARY KEY(ID,NO)); 4INSERT INTO tbl_B(ID,NO,NAME,KOSHIN_DATE) VALUES(2,2000,'hoge','2016-07-21 02:00:00'),(3,300,'fuga','2016-07-21 04:00:00'),(4,4000,'fuga','2016-07-21 04:00:00');

データ更新

SQL

1INSERT IGNORE INTO tbl_A SELECT * FROM tbl_B; 2UPDATE tbl_A,tbl_B SET tbl_A.NO=tbl_B.NO,tbl_A.NAME=tbl_B.NAME,tbl_A.KOSHIN_DATE=NOW() WHERE tbl_A.ID=tbl_B.ID AND tbl_A.NO=tbl_B.NO;

複合PRIMARYということなので、IDのみの合致ではなくNOまで条件に入れてあります

投稿2016/07/21 04:47

編集2016/07/21 05:31
yambejp

総合スコア114572

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

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

DENQ

2016/07/21 05:20

複合主キーです。紛らわしくて申し訳ありません。
yambejp

2016/07/21 05:29

私の環境がMySQLなので若干SQL Serverと書式が違うと思いますが INSERT IGNORE INTOしたあとUPDATEをかけてみてはいかがでしょうか? 追記しておきます
guest

0

差分抽出でしたらEXCEPTを利用するのはどうでしょう?

SQL

1SELECT 2 ID 3 , NO 4 , NAME 5 , KOSHIN_DATE 6FROM 7 A_table 8EXCEPT 9SELECT 10 ID 11 , NO 12 , NAME 13 , KOSHIN_DATE 14FROM 15 B_table

こんな感じで使い方はUNION、UNION ALLとほぼ同様です。
上記の例だとAテーブルにあってBテーブルにない(ID~NAMEのいずれかにに差分がある)ものが抽出されます。

投稿2016/07/20 10:31

編集2016/07/20 10:34
Panzer_vor

総合スコア1636

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

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

DENQ

2016/07/21 01:06

回答ありがとうございます。 差分があるレコードをに対して、BテーブルのデータをAテーブルにUPDATEしたいのですが、何かいい方法はございますか?
Panzer_vor

2016/07/21 07:22

要件の確認となります。 BテーブルにあってAテーブルにないケースも差分と言えると思いますが、 この場合はAテーブルにINSERTをかける必要はあるでしょうか? INSERTとも必要となると、 MERGE文を利用するのが手っ取り早いかもしれません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問