【SQL】複雑な問合わせ

指定した値をすべて含むレコードを検索

bが1~5を含むレコードのaを取得

SELECT a FROM t1 WHERE b IN (1,2,3,4,5) 
  GROUP BY a HAVING CONST(DISTINCT b) = 5

最大の値を持つレコードをキーごとに抽出

group by でキーを指定するのがポイント

SELECT a.* FROM 社員マスタ a 
  INNER JOIN ( 
    SELECT 部署コード, MAX(入社年月日) MAX_入社年月日 FROM 社員マスタ GROUP BY 部署コード
  ) b 
    ON a.部署コード = b.部署コード 
    AND a.入社年月日 = b.MAX_入社年月日

【例】"部署コードごと"に入社年月日が最大のレコードを抽出
(抽出前)

社員コード 氏名 生年月日 住所 電話番号 部署コード 入社年月日
0001 高橋 一生 1988/11/09 大阪府大阪市北区池田町1-1 080-1111-1111 001 2001/04/01
0002 高橋 二生 1989/12/02 大阪府大阪市北区池田町1-1 080-1111-2222 001 2002/04/01
0003 検証 太郎 1999/01/01 大阪府大阪市 090-1111-2222 002 2010/01/01
0004 検証 次郎 1999/01/01 大阪府大阪市 090-1111-2222 002 2011/01/01

(抽出後)

社員コード 氏名 生年月日 住所 電話番号 部署コード 入社年月日
0002 高橋 二生 1989/12/02 大阪府大阪市北区池田町1-1 080-1111-2222 001 2002/04/01
0004 検証 次郎 1999/01/01 大阪府大阪市 090-1111-2222 002 2011/01/01

最大の値を持つレコードを抽出

WHEREのサブクエリを使用するのがポイント

SELECT * FROM 社員マスタ
  WHERE 入社年月日 = ( 
    SELECT MAX(入社年月日) FROM 社員マスタ
  )  

【例】入社年月日が最大のレコードを抽出
(抽出前)

社員コード 氏名 生年月日 住所 電話番号 部署コード 入社年月日
0003 検証 太郎 1999/01/01 大阪府大阪市 090-1111-2222 002 2010/01/01
0004 検証 次郎 1999/01/01 大阪府大阪市 090-1111-2222 002 2011/01/01

(抽出後)

社員コード 氏名 生年月日 住所 電話番号 部署コード 入社年月日
0004 検証 次郎 1999/01/01 大阪府大阪市 090-1111-2222 002 2011/01/01