0

gorpaud_pinレコードがテーブルに追加された日付に基づいて、 の最新の値を検索しようとしています。

レコードがない場合、クエリ全体でゼロ レコードが返されます。

代わりに必要なのは、 の値が空白の 1 つのレコードですgorpaud_pin

SELECT spriden_id, 
          spriden_last_name, 
          spriden_first_name, 
          gorpaud_pin 
     FROM spriden 
LEFT JOIN gorpaud A 
       ON spriden_pidm = A.gorpaud_pidm 
      AND A.gorpaud_chg_ind = 'P' 
      AND A.gorpaud_pin IS NOT NULL 
    WHERE spriden_change_ind IS NULL 
      AND spriden_entity_ind = 'P' 
      AND to_char(A.gorpaud_activity_date, 'YYYY-MM-DD HH24:MI:SS') = 
        (SELECT max(to_char(B.gorpaud_activity_date, 'YYYY-MM-DD HH24:MI:SS')) 
           FROM gorpaud B 
          WHERE B.gorpaud_pidm = A.gorpaud_pidm
            AND B.gorpaud_chg_ind = 'P' 
            AND B.gorpaud_pin IS NOT NULL)
4

2 に答える 2

1

などの Oracle の分析関数を使用dense_rankして番号付けを行い、「最高」にランク付けされていないすべてのレコードを除外できます。

の代わりにまたはdense_rankを使用することもできます。微妙な違いがあり、どちらが必要かは、(同じ日付の) 重複行をどのように処理するかによって異なります。それが問題なければ、どちらでも使用できると思います。rankrow_number

SELECT
  spriden_id, 
  spriden_last_name, 
  spriden_first_name
FROM
  (SELECT
    s.spriden_id, 
    s.spriden_last_name, 
    s.spriden_first_name, 
    DENSE_RANK() OVER (
      PARTITION BY s.spriden_id 
      ORDER BY g.gorpaud_activity_date DESC) AS rank
  FROM spriden s
  LEFT JOIN gorpaud g 
    ON g.gorpaud_pidm = s.spriden_pidm
    AND g.gorpaud_chg_ind = 'P'
    AND g.gorpaud_pin IS NOT NULL)
WHERE
  rank = 1

MAXor ORDER BYon date 値を安全に使用できることに注意してください。最初にそれらを文字に変換する必要はありません。変換を行わないと、クエリが高速になり、読みやすくなります。

于 2013-10-29T20:48:11.427 に答える