0

我正在尝试gorpaud_pin根据记录添加到表中的日期查找 的最新值。

如果没有记录,则整个查询返回零记录。

我需要的是一个具有空白值的记录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,您还可以使用rankor row_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

请注意,您可以安全地使用MAXORDER BY日期值。您不需要先将它们转换为字符。如果没有转换,查询可能会更快并且更具可读性。

于 2013-10-29T20:48:11.427 回答
0

尝试将 thr gorpaud 部分合并到一个单独的子查询中,然后加入它。就像是:

select
spriden_id, 
          spriden_last_name, 
          spriden_first_name, 
          gorpaud_pin 

FROM
spriden
left outer join
  (select a.* from gorpaud a
   where 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)) T
on spriden_pidm = t.gorpaud_pm
于 2013-10-29T21:06:00.053 回答