Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 更新联接表中的字段_Sql_Oracle - Fatal编程技术网

Sql 更新联接表中的字段

Sql 更新联接表中的字段,sql,oracle,Sql,Oracle,我有一个select查询 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

我有一个select查询

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\u TO\u EXT\u IND字段设置为“Y”

请提出问题

谢谢

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,所以可以充分利用它


请注意,这实际上没有连接条件……WHERE条件中应该有一个MFD.FUNDID=MFH.FUNDID或类似的子句。否则,您将采用非常迂回的方式将所有N值设置为Y。

我认为您缺少第一行上的“每月资金”详细信息。如果是这样,这是执行您希望执行的更新的一种方法:

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'

您的查询将无法编译,因为它缺少FROM子句

如果添加它,我们将看到该查询是一个交叉连接:

不过,我不确定这是你想要的

在查询中添加连接条件,使其有意义。

这应该可以:

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不支持语法更新。

您可以使用以下更新语句

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)

我认为你错过了完整的问题。FROM子句在哪里?我相信他在选择MFD.MONTHLY\u FUND\u HEADER\u ID之后想要它,在编辑时我注意到没有FROM。虽然有些人在更新查询中回答了您,但您最好了解它&改为成为专家;。我的意思是-写一个更新是最基本的事情开始。这样你就可以得到答案,但除非你阅读/理解这些内容,否则你将无法学习它。MFH.MOUNT和MFH.YEAR可能不是字符类型-你在predictas中有一个隐式类型转换,你应该修复它们。@Tony:否。要更新视图中的表,包括包含联接的内联视图,您要更新的表必须与主键或唯一字段上的另一个表联接。这保证您正在更新的表中的每一行最多只被选择一次。如果不满足此条件,Oracle将在编译时使用臭名昭著的ORA-01779拒绝查询:无法修改映射到非键保留表的列。Oracle决定将其设置为编译时限制,而不是运行时限制,这就是为什么您的查询会因此错误而失败。@Tony:the@op提供的视图根本不包含任何jon条件。哦,我明白了。我必须承认,我没有检查必要的连接是否存在就假设了!
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';
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)