【问题标题】:Oracle Query on Max(Date)最大(日期)上的 Oracle 查询
【发布时间】:2018-02-26 06:05:44
【问题描述】:

我的目标是创建一个查询,然后创建一个更新语句,它将 CI 字段更新为“1”,但前提是 max(vt_end) 小于 sysdate AND,前提是不存在已经为该特定代码的 31-dec-9999 的 max(vt_end) 更新了记录。我在下面有我的基本查询,但我不确定如何仅识别要更新的那些记录。

SELECT CODE,
     MAX (VT_END),
     TT_STOP,
     MOST_RECENT_IND AS MRI,
     CURRENT_IND AS CI
FROM TABLE
WHERE TT_STOP > SYSDATE AND CODE IN ('0001F', '0001M', '0001T')
GROUP BY CODE,
     VT_END,
     MOST_RECENT_IND,
     CURRENT_IND
ORDER BY CODE, VT_END


CODE    VT_END       TT_STOP    MRI CI  
0001F   12/31/2004  12/31/9999  0   0  
0001F   12/31/2006  12/31/9999  0   0  
0001F   3/31/2007   12/31/9999  0   0  
0001F   12/31/2007  12/31/9999  0   0  
0001F   12/31/2011  12/31/9999  0   0  
0001F   12/31/2012  12/31/9999  0   0  
0001F   12/31/9999  12/31/9999  1   1  
0001T   12/31/2003  12/31/9999  0   0  
0001T   12/31/2004  12/31/9999  0   0  

我也尝试过这个查询,但它是错误的,因为它带回了 0001F 12/31/2012 的记录,这是不正确的,因为它已经有一条记录 '31-dec-9999'

SELECT CODE,
     MAX (VT_END),
     MOST_RECENT_IND AS MRI,
     CURRENT_IND AS CI
FROM SRC_PROCDR_DESCRIPTOR_SCD2
WHERE TT_STOP > SYSDATE AND CODE IN ('0001F', '0001M', '0001T')
AND VT_END <> '31-dec-9999'
GROUP BY CODE,
     MOST_RECENT_IND,
     CURRENT_IND
ORDER BY CODE

Incorrect Results:
CODE    VT_END       TT_STOP    MRI CI 
0001F   12/31/2012  0   0
0001T   12/31/2004  0   0

结果应该是

CODE    VT_END       TT_STOP    MRI CI 
0001T   12/31/2004  12/31/9999  0   0   - Update to '1' on CI  
--This should be the only record returned in the above query to put into an 
UPDATE statement.

【问题讨论】:

  • 如果您的目标是创建更新语句,为什么要使用SELECT
  • 从 GROUP_BY 中删除 VT_END。
  • 我正在尝试先识别记录,然后创建更新语句。
  • 我从组中删除了 VT_END,但我仍然得到 0001F 的 2 条记录。最终,我只需要返回 1 条记录,即 0001T VT_END 12/31/2004。
  • 我编辑了我的标题和结果。感谢您的反馈。

标签: sql oracle update-statement


【解决方案1】:

您正在使用MAX(),但您需要使用EXISTS,因为使用MAX() 您可以混合来自不同行的值,我想您需要同时使用CODEVT_END 进行更新:

SELECT CODE, VT_END
FROM TABLE1
WHERE TT_STOP > SYSDATE
  AND CODE IN ('0001F', '0001M', '0001T')
  AND VT_END <> '31-dec-9999'
  AND NOT EXISTS(SELECT * FROM TABLE1 T1
    WHERE T1.CODE=TABLE1.CODE -- join condition
      AND T1.VT_END>TABLE1.VT_END) -- filter condition
ORDER BY CODE

这将返回每个CODE 的最大VT_END 行,前提是最大VT_END 不是'31-dec-9999'(使用NOT EXIST (...) 可以获得最大日期,使用VT_END &lt;&gt; '31-dec-9999' 过滤掉行已更新)。

【讨论】:

  • 很好的解决方案!谢谢你解释逻辑。我非常感谢您的帮助和指导。
  • 不客气,感谢您努力学习,而不仅仅是复制粘贴解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-22
  • 2020-09-09
  • 2012-09-07
  • 2012-01-09
  • 2011-01-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多