- ベストアンサー
最新レコードを抽出し外部結合する方法について
- 最新レコードを抽出し外部結合するSQLについての情報を求めています。
- テーブルAとテーブルBを名前で結合し、最新の更新日付のレコードを抽出する方法を知りたいです。
- テーブルAの名前、点数、更新日付とテーブルBの判定を抽出し、条件に応じて判定結果を出力する方法を教えてください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
PostgreSQL 8.3 ですと、「最新の「更新日付」のレコードを抽出」の箇所でセルフジョインが必要になります。 具体的なSQLはこのような感じです。最新の日付を max() で計算しているので、更新日付のデータ型を date にするか、文字列の場合はゼロ埋め ("2011/04/03") しておいてください。 CREATE TABLE テーブルA (名前 text, 点数 integer, 更新日付 date); INSERT INTO テーブルA VALUES ('AAA', 98, '2011/4/1'), ('AAA', 60, '2011/4/3'), ('BBB', 70, '2011/4/2'), ('BBB', 35, '2011/4/4'), ('DDD', 98, '2011/4/1'), ('EEE', 47, '2011/4/5'), ('GGG', 80, '2011/4/6'); CREATE TABLE テーブルB (名前 text, 判定 integer); INSERT INTO テーブルB VALUES ('AAA', 0), ('BBB', 1), ('CCC', 1), ('BBB', 1), ('DDD', 0), ('EEE', 0), ('GGG', 1); SELECT 名前, 点数, 更新日付, CASE WHEN max_a.名前 IS NOT NULL THEN 0 ELSE 判定 END AS 判定 FROM (SELECT 名前, max(更新日付) AS 更新日付 FROM テーブルA GROUP BY 名前) AS max_a JOIN テーブルA USING (名前, 更新日付) RIGHT JOIN テーブルB USING (名前);
その他の回答 (1)
- yamada_g
- ベストアンサー率68% (258/374)
最新レコードを抽出するのにnot existsを使う方法もありますね。 そこの部分以外はgacky-79さんのSQLをそのまま使わせていただきました。 SELECT 名前, 点数, 更新日付, CASE WHEN max_a.名前 IS NOT NULL THEN 0 ELSE 判定 END AS 判定 FROM (SELECT * FROM テーブルA AS A1 WHERE NOT EXISTS( SELECT * FROM テーブルA AS A2 WHERE A1.名前 = A2.名前 AND A1.更新日付 < A2.更新日付 )) AS テーブルA RIGHT JOIN テーブルB USING (名前);
お礼
お礼が遅くなり申し訳ありません。 ご回答ありがとうございます。 not existsを使用しても実現可能なんですね。性能面も考えて NO.1の方のとどちらを使用するか検討させて頂きます。 ご協力ありがとうございました。
お礼
お礼が遅くなり申し訳ありません。 ご回答ありがとうございます。 頂いたSQLで実現できました。また、更新日付のデータ型についても了解致しました。 ご協力ありがとうございました。