在Join表中更新字段

时间:2009-07-20 16:46:40

标签: sql oracle

我有一个选择查询

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'以进行上述连接

请建议查询。

谢谢!

5 个答案:

答案 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确实支持“更新自”语法。