如果没有子查询结果,则需要返回空值

时间:2013-10-29 20:38:45

标签: sql oracle null subquery

我正在尝试根据记录添加到表中的日期查找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)

2 个答案:

答案 0 :(得分:1)

您可以使用Oracle的分析功能(如dense_rank)进行编号,然后过滤掉所有未排名“最高”的记录。

您可以使用dense_rankrank,而不是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。您不需要先将它们转换为字符。如果没有转换,查询可能会更快并且更具可读性。

答案 1 :(得分: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