我有一个选择查询
SELECT MFD.MONTHLY_FUND_HEADER_ID
FROM MONTHLY_FUND_DETAIL MFD, MONTHLY_FUND_HEADER MFH
WHERE
MFH.MONTH < TO_CHAR(TRUNC(sysdate), 'MM')
AND MFH.YEAR <= TO_CHAR(TRUNC(sysdate), 'YYYY')
AND MFH.CERTIFIED_DT IS NOT NULL
AND MFD.SENT_TO_EXT_IND = 'N' AND MFH.COURT_CD = '56'
GROUP BY MFD.MONTHLY_FUND_HEADER_ID
现在我想要一个更新查询,将MFD.SENT_TO_EXT_IND
字段设置为'Y'
以进行上述连接
请建议查询。
谢谢!
答案 0 :(得分:1)
update
子句适用于Oracle中的子查询。所以,你可以这样做:
UPDATE
(SELECT
mfd.sent_to_ext_ind
FROM
MONTHLY_FUND_DETAIL MFD,
MONTHLY_FUND_HEADER MFH
WHERE
(MFH.MONTH < TO_CHAR(TRUNC(sysdate),'MM')
AND MFH.YEAR <=TO_CHAR(TRUNC(sysdate) , 'YYYY'))
AND MFH.CERTIFIED_DT IS NOT NULL
AND MFD.SENT_TO_EXT_IND = 'N'
AND MFH.COURT_CD= '56') mfd
SET sent_to_ext_ind = 'Y'
只需确保您要更新的表是FROM
子句中的第一个表。您不必将查询修改为太多。
应该注意,这不是ANSI,但它确实适用于Oracle。由于您使用的是Oracle,因此可以利用它!
请注意,这实际上没有连接条件...... MFD.FUNDID = MFH.FUNDID
条件中应该有WHERE
或类似的子句。否则,您将以非常迂回的方式将所有N
值设置为Y
。
答案 1 :(得分:1)
您的查询将无法编译,因为它错过了FROM
子句。
如果我们添加它,我们会看到该查询是CROSS JOIN
:
SELECT MFD.MONTHLY_FUND_HEADER_ID
FROM MONTHLY_FUND_DETAIL MFD, MONTHLY_FUND_HEADER MFH
WHERE MFH.MONTH < TO_CHAR(TRUNC(sysdate),'MM'
AND MFH.YEAR <= TO_CHAR(TRUNC(sysdate) , 'YYYY'))
AND MFH.CERTIFIED_DT IS NOT NULL
AND MFH.COURT_CD = '56'
AND MFD.SENT_TO_EXT_IND = 'N'
GROUP BY
MFD.MONTHLY_FUND_HEADER_ID
,因此您要求更新当前包含“N”的所有MONTHLY_FUND_DETAIL
行:
UPDATE MONTHLY_FUND_DETAIL
SET SENT_TO_EXT_IND = 'Y'
WHERE SENT_TO_EXT_IND = 'N'
不确定,这是你想要的。
在查询中添加JOIN
条件,以便它有意义。
答案 2 :(得分:1)
您可以使用以下更新声明
update MONTHLY_FUND_DETAIL
set SENT_TO_EXT_IND = 'Y'
where MONTHLY_FUND_HEADER_ID in (
SELECT MFD.MONTHLY_FUND_HEADER_ID
FROM MONTHLY_FUND_DETAIL MFD, MONTHLY_FUND_HEADER MFH
WHERE
MFH.MONTH < TO_CHAR(TRUNC(sysdate), 'MM')
AND MFH.YEAR <= TO_CHAR(TRUNC(sysdate), 'YYYY')
AND MFH.CERTIFIED_DT IS NOT NULL
AND MFD.SENT_TO_EXT_IND = 'N' AND MFH.COURT_CD = '56'
GROUP BY MFD.MONTHLY_FUND_HEADER_ID)
答案 3 :(得分:0)
我认为你在第一行的MONTHLY_FUND_DETAIL之前缺少“FROM”。如果是这样,这是执行您要执行的更新的一种方法:
UPDATE MFDT
SET MFDT.SENT_TO_EXT_IND = 'Y'
FROM MONTHLY_FUND_DETAIL MFDT
JOIN MONTHLY_FUND_HEADER MFH ON MFDT.MONTHLY_FUND_HEADER_ID = MFH.MONTHLY_FUND_HEADER_ID
WHERE (MFH.MONTH < TO_CHAR(TRUNC(sysdate),'MM')
AND MFH.YEAR <=TO_CHAR(TRUNC(sysdate) , 'YYYY'))
AND MFH.CERTIFIED_DT IS NOT NULL
AND MFD.SENT_TO_EXT_IND = 'N'
AND MFH.COURT_CD= '56'
答案 4 :(得分:0)
这应该有效:
update
( select mfd.sent_to_ext_ind
from monthly_fund_detail mfd,
monthly_fund_header mfh
where (mfh.month < to_char(trunc(sysdate),'MM')
and mfh.year <=to_char(trunc(sysdate) , 'YYYY'))
and mfh.certified_dt is not null
and mfd.sent_to_ext_ind = 'N' and mfh.court_cd= '56'
)
set sent_to_ext_ind = 'Y';
与其他答案相反,Oracle确实不支持“更新自”语法。