【发布时间】: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