2009-07-20 6 views
2

조인 테이블의 필드 업데이트

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 

로 선택 쿼리가 있습니다. 위의 'Y'MFD.SENT_TO_EXT_IND 필드를 설정하는 업데이트 쿼리가 필요합니다.

쿼리를 제안하십시오.

고마워!

+3

난 당신이 전체 쿼리를 누락 생각를 사용할 수 있습니다. FROM 절은 어디에 있습니까? – shahkalpesh

+0

그가 MFD.MONTHLY_FUND_HEADER_ID를 선택한 후에 원하는 것을 믿을 수 있는데, 편집 중에는 아무 것도 없었습니다. – curtisk

+0

일부 사람들이 UPDATE 쿼리에 대해 답변 해 주었지만, 그것에 대해 배우고 전문가가 될 수도 있습니다.). 제 말은 - UPDATE를 쓰는 것은 기본적으로 시작하는 것입니다. 당신은 SO에 대한 답을 얻을 수 있지만, 당신이 그 물건을 읽고 이해하지 않는다면 그것을 배우지 않을 것입니다. – shahkalpesh

답변

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가 아니지만 오라클과 호환됩니다. 오라클을 사용하고 있으므로 오라클을 활용할 수 있습니다!

실제로는 조인 조건이 없음을 유의하십시오. MFD.FUNDID = MFH.FUNDID 또는 이와 유사한 절이 WHERE 조건에 있어야합니다. 그렇지 않으면 모든 N 값을 Y으로 설정하는 매우 순환적인 방법을 사용하고 있습니다.

+0

-1 "update from"은 Oracle에서 작동하지 않습니다 –

0

첫 번째 줄의 MONTHLY_FUND_DETAIL 이전에 "FROM"이 누락 된 것 같습니다. 이 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' 
+0

-1 죄송 합니다만 "update from"은 Oracle에서는 작동하지 않습니다 –

1

귀하의 쿼리가 컴파일되지 않습니다 : 그렇다면, 이것은 당신이 찾고있는 업데이트를 수행하는 한 가지 방법이다. 당신은 현재 'N'을 개최 MONTHLY_FUND_DETAIL의 모든 행을 업데이트하는 방법에 대한 요구하고 있으므로,

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 

: 우리가 그것을 추가하는 경우

, 우리는 조회가 CROSS JOIN 것을 볼 수 있습니다

UPDATE MONTHLY_FUND_DETAIL 
SET  SENT_TO_EXT_IND = 'Y' 
WHERE SENT_TO_EXT_IND = 'N' 

확실하지 않지만, 그것이 당신이 원하는 것입니다.

JOIN 조건을 쿼리에 추가하면 의미가 있습니다.

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'; 

, 오라클 구문 하지 지원 "에서 업데이 트를"않습니다.

+0

이 쿼리는 키 보존되지 않으므로 작동하지 않습니다. – Quassnoi

+0

아마 지금입니까? –

+0

@ 토니 : 아니요. 'JOIN'을 포함하는 뷰 (인라인 뷰 포함)에서 테이블을 업데이트하려면, 갱신중인 테이블을'PRIMARY KEY' 또는'UNIQUE' 필드의 다른 테이블과 조인해야합니다. 이렇게하면 업데이트하려는 테이블의 각 행이 최대 한 번만 선택됩니다. 이 조건이 만족스럽지 않으면 오라클은 악명 높은 ORA-01779 : 비 키 보존 테이블에 매핑되는 열을 수정할 수 없다는 컴파일 타임에 쿼리를 거부합니다. 오라클은 런타임이 아닌 컴파일 시간 제한으로하기로 결정했기 때문에이 오류로 인해 쿼리가 실패합니다. – Quassnoi

1

당신은 UPDATE 문

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) 
관련 문제