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

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

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

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

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

Q&A

解決済

2回答

262閲覧

SQLでのデータ取得方法について

uruban

総合スコア24

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

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

0グッド

1クリップ

投稿2018/11/08 13:28

編集2018/11/08 13:43

以下のような、学校のクラスの生徒を保持しているテーブルと、履歴を保持するテーブルがあるとします

■現クラステーブル:
今現在のクラスの生徒の情報を保持しているテーブル

■旧クラステーブル:
クラスに生徒が増えると登録されるテーブルで、
履歴を管理する番号と生徒の番号を保持しているテーブル

現クラステーブル

クラスID生徒連番生徒名
10001田中一郎
10002佐藤二郎
10003鈴木三郎

旧クラステーブル

クラスIDクラス履歴番号生徒連番生徒名
100011田中一郎
100021田中一郎
100022佐藤二郎

上記のようなデータが存在した時、
以下の結果を返すSQLを作成したいです。
(現在のクラスの生徒と、ある時点のクラスの生徒の情報を併せて取得したい)

旧クラスID旧クラス履歴番号旧生徒連番旧生徒名現クラスID現生徒連番現生徒名
100021田中一郎10001田中一郎
100022佐藤二郎10002佐藤二郎
10003鈴木三郎

取得できた同じレコードの「旧生徒連番と旧生徒名を連結したもの」と、「新生徒連番と新生徒名を連結したもの」を比較し、
違っていれば、追加/変更があったと検知したいです。
比較自体はSQLでやる必要はないので、データを取得できるところまで実現できれば問題ありません。

以下のSQLを作成してみましたが、意図した結果にはなりませんでした。
ご助言いただける方、コメントをお願い致します。

SQL

1SELECT 2 A.クラスID, 3 A.クラス履歴連番, 4 A.生徒連番, 5 A.生徒名, 6 B.クラスID, 7 B.生徒連番, 8 B.生徒名 9FROM 10 旧クラステーブル A, 11 現クラステーブル B 12WHERE 13 A.クラスID = B.クラスID and 14 B.クラス履歴番号 = '2'

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

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

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

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

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

guest

回答2

0

ノーチェックですが

SQL

1SELECT 2 A.クラスID, 3 A.クラス履歴連番, 4 A.生徒連番, 5 A.生徒名, 6 B.クラスID, 7 B.生徒連番, 8 B.生徒名 9FROM 10 現クラステーブル B LEFT JOIN 11 (SELECT * FROM 旧クラステーブル WHERE クラス履歴番号 = '2') A ON A.クラスID = B.クラスID

でできませんか

投稿2018/11/08 13:41

rururu3

総合スコア5545

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

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

uruban

2018/11/08 13:44

早々の回答ありがとうございます 確認してみます
uruban

2018/11/09 01:46

求めている結果は求められませんでしたが、コメントありがとうございました
rururu3

2018/11/09 01:55

よく見たらちょっと間違ってましたね・・・チェック大切ですねw
guest

0

ベストアンサー

取得できた同じレコードの「旧生徒連番と旧生徒名を連結したもの」と、「新生徒連番と新生徒名を連結したもの」を比較し、違っていれば、追加/変更があったと検知したいです。

求める結果を出すには結合する必要があります。
結合する=等しいとなるので、その後の比較には意味がありません。
生徒連番で結合するなら、生徒名で比較だし、生徒名で結合するなら生徒連番という片側での比較でしょう。

取り敢えずそれは置いといて、旧クラステーブルの最新(クラス履歴番号が最大のもの)と現クラステーブルの突合について、

SQL

1SELECT 2 A.クラスID, A.クラス履歴連番, A.生徒連番, A.生徒名 3 , B.クラスID, B.生徒連番, B.生徒名 4FROM 5 現クラステーブル B full join ( 6 select * from 旧クラステーブル a0 7 where 旧クラス履歴番号=( 8 select max(旧クラス履歴番号) from 旧クラステーブル where クラスID=a0.クラスID 9 ) 10 ) A on B.クラスID=A.クラスID and B.生徒連番=A.生徒連番

全外部結合で取り出せば、削除も判断できます。(不要なら、left joinに変更して下さい)

性能を考慮した別パターン

SQL

1SELECT 2 A.クラスID, A.クラス履歴連番, A.生徒連番, A.生徒名 3 , B.クラスID, B.生徒連番, B.生徒名 4FROM 5 現クラステーブル B full join ( 6 select * from 旧クラステーブル a0 7 where (クラスID, 旧クラス履歴番号) in ( 8 select クラスID, max(旧クラス履歴番号) from 旧クラステーブル group by クラスID 9 ) 10 ) A on B.クラスID=A.クラスID and B.生徒連番=A.生徒連番

投稿2018/11/08 15:47

編集2018/11/09 02:04
sazi

総合スコア25188

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

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

uruban

2018/11/09 01:50

ありがとうございました。求める結果が得られました。 連結という言葉が誤解を与えてしまったかもしれません。 私がイメージしていたのは、 生徒連番と生徒名を、concatして、1田中という文字列にして、 比較すれば、連番は同じだが、名前が違うというケースでも、 差分を検知できると考えました。
sazi

2018/11/09 02:05

別パターンを追記しました。 インデックスの状況にもよると思いますが、性能に差が出るかもしれません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問