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

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

新規登録して質問してみよう
ただいま回答率
85.50%
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回答

4373閲覧

最大値が格納されている行を、複数取得する方法

darum

総合スコア70

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グッド

3クリップ

投稿2015/05/03 00:27

下記のようなテーブルがあるとします。

<Employee> EMP_ID INTEGER PK NAME VARCHAR(40) <SARALY> EMP_ID INTEGER -- Employee.EMP_IDがFK, PK START_MONTH INTEGER PK PRICE INTEGER

START_MONTH は、201505のようにyyyyMM で、開始月を示します。

このような構成で、社員の給料を管理するとします。

ここで、「全社員の現在の給料テーブル」を取得したい場合にはどうしたらよいでしょうか?

なお、
「ある社員の現在の給料を取得する」場合は、下記の通りということでできました。

lang

1SELECT 2 a.EMP_ID 3 , a.NAME 4 , b.PRICE 5FROM 6 EMPLOYEE a 7 LEFT OUTER JOIN SARALY b 8 on a.EMP_ID = b.EMP_ID 9WHERE 10 a.EMP_ID=? 11 AND b.START_MONTH = ( 12 SELECT 13 MAX(START_MONTH) 14 FROM 15 SARALY 16 WHERE 17 EMP_ID=? 18 )

?には、同じ従業員番号を指定します。

よろしくお願いします。

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

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

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

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

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

guest

回答2

0

サブクエリを使うと、最大値のサブクエリと社員との結合にインデックスが使えません。
社員数が多いときは、以下も試してみてください。

SELECT
a.EMP_ID
, a.NAME
, b.PRICE
FROM
Employee a
INNER JOIN SARALY b
ON a.EMP_ID = b.EMP_ID
WHERE
EXISTS(
SELECT 1
FROM SARALY s
WHERE s.EMP_ID = a.EMP_ID
GROUP BY s.EMP_ID
HAVING MAX(s.START_MONTH) = b.START_MONTH
)
UNION ALL
SELECT
a.EMP_ID
, a.NAME
, NULL
FROM
Employee a
WHERE NOT EXISTS(
SELECT 1
FROM SARALY s
WHERE s.EMP_ID = a.EMP_ID
)
;

投稿2015/05/04 02:19

kantomi

総合スコア295

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

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

0

ベストアンサー

こんにちは。

「現在」というのはそのある社員の、最終給与を示しています?
各社員毎の最終年月を求めてbとして結合させてみる。

以下、postgresで未検証なので細かい構文ミスあったらすみません。

lang

1SELECT 2 a.EMP_ID 3 , a.NAME 4 , b.PRICE 5FROM 6 Employee a 7 LEFT OUTER JOIN 8 ( 9 SELECT 10 x.* 11 FROM 12 SARALY x 13 INNER JOIN 14 ( 15 SELECT 16 EMP_ID 17 ,MAX(START_MONTH) MONTH 18 FROM 19 SARALY y 20 GROUP BY 21 EMP_ID 22 ) y 23 ON 24 x.EMP_ID = y.EMP_ID 25 AND x.START_MONTH = y.MONTH 26 ) b 27 ON a.EMP_ID = b.EMP_ID

投稿2015/05/03 03:54

Tak1wa

総合スコア4791

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

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

darum

2015/05/03 22:05

ありがとうございます。 成功しました。 最大値のテーブルを作っておいて、それと結合すればよいのですね。 勉強になります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問