2014-11-18 2 views
0

스택 오버 플로우에 새로운 브랜드이므로 게시 할 때 잘못 처리하면 사과드립니다. 이 코드 블록에 몇 가지 문제가 있습니다. 내 조인에 문제가 있다고 생각합니다. 오라클 코드에서의 에러 - 동일하지 않음 연산

UPDATE rental_item ri 
SET  rental_item_price = 
     (SELECT p.amount 
     FROM  price p INNER JOIN common_lookup cl1 
     ON  p.price_type = cl1.common_lookup_id CROSS JOIN rental r 
       CROSS JOIN common_lookup cl2 
     WHERE p.item_id = ri.item_id AND ri.rental_id = r.rental_id 
     AND  ri.rental_item_type = cl2.common_lookup_id 
     AND  cl1.common_lookup_code = cl2.common_lookup_code 
     AND  r.check_out_date 
        BETWEEN p.start_date AND p.end_date); 

코드 블록

은 상기 지정된 기준을 이용하여 "AMOUNT '항목의 데이터로"RENTAL_ITEM_PRICE'항목을 작성하기로한다. WHERE 및 AND 문에서 기준을 제거 할 수 없습니다.

RENTAL_ITEM_ID RENTAL_ITEM_PRICE AMOUNT 
-------------- ----------------- ------ 
    1001        5 
    1002        5 
    1003        5 
    1004        5 
    1005        5 
    1006        5 
    1007        5 
    1008        5 
    1009        5 
    1010        3 
    1011        3 
    1012       10 
    1013       15 

코드를 실행하면 13 개의 행이 업데이트되었지만 볼 수 있듯이 정보가 기록되지 않습니다. 또한 오류를 반환하지 않습니다.

은 다음과 같아야합니다

RENTAL_ITEM_ID RENTAL_ITEM_PRICE  AMOUNT 
-------------- ----------------- ---------- 
     1001     5   5 
     1002     5   5 
     1003     5   5 
     1004     5   5 
     1005     5   5 
     1006     5   5 
     1007     5   5 
     1008     5   5 
     1009     5   5 
     1010     3   3 
     1011     3   3 
     1012    10   10 
     1013    15   15 
+0

쿼리가 예상 값을 단순 선택으로 반환합니까? 나는 단지 어떤 데이터도 찾지 못했을 것이라고 생각하지만, 왜 데이터를 보지 않고 왜 추측 할 수는 없다. 왜 당신은 십자가 조인을하고 where 조약을 통해 내부 조인으로 되돌려 놓고 있습니까? –

+0

내 생각 엔 하위 쿼리가 0 행을 반환하므로 값이 NULL로 업데이트됩니다. –

+0

@AlexPoole 테스트를 위해 간단한 SELECT 문을 사용하려고했으나 일부 ​​별칭이 UPDATE 줄없이 제대로 정의되지 않았기 때문에 실패합니다. 누락 된 데이터와 관련하여 하위 쿼리에서 참조되는 모든 필드에는 정보가 들어 있습니다. 따라서 데이터를 가져올 수 있습니다. Gordon Linoff가 하위 쿼리가 0을 반환한다고 언급 한 것으로 추측합니다. 조인이 쓰여지는 방식이 문제를 일으키는 것 같아요. 하위 쿼리를 수정하는 방법에 대한 제안 사항이 있습니까? 미안해, 내 질문에 더 좋은 방법이 없어. – kb4000

답변

1

귀하의 하위 쿼리에 행을 반환하지 않습니다, 그래서 업데이트가 null로 모든 rental_item_price 값을 설정한다. 자체적으로 하위 쿼리 실행 - ri.* 열 대신 rental_item 테이블의 실제 값을 대체하여 select 부분 만 실행하면 해당 별칭이 존재하지 않습니다. 데이터를 찾을 수 없을 것입니다.

그렇다면 기본 디버깅 인 조인 또는 조건 중 올바르지 않은 것이 무엇인지 파악해야하지만 일부 데이터가 나타날 때까지 필터 조건을 제거하거나 조인 조건을 검사하여 시작할 수 있습니다.

내 초기 추측은 이제 price.end_date이 null 일 수 있습니다. 활성 제품이 있고 인공 마법 종료일 (예 : 9999-12-31)을 설정하지 않으면 의미가 있습니다. Y10K 문제의). between 절은 실제 날짜와 null 사이에 아무 것도 없으므로 어쨌든 일치하지 않습니다.

끝 날짜를 테이블에서 마술 값으로 설정할 수 있습니다. 많은 사람들이 불쾌한 해킹을 고려하거나 더 나은 것이 아닌 쿼리의 일부로 마법의 미래 날짜로 처리하거나 기본값으로 비교 날짜 :

r.check_out_date BETWEEN p.start_date 
    AND COALESCE(p.end_date, r.check_out_date) 

내가 common_lookup에 대한 조인 자체는 적어도에 대한 필터 조건을 조인 크로스를 사용하고 적용하는 이유는 확실하지 않다; 질문과 관련이 없지만 내가 생각하는 것에서 하위 쿼리를 다음과 같이 구성했을 수 있습니다.

SELECT p.amount 
FROM rental r 
CROSS JOIN common_lookup cl1 
INNER JOIN common_lookup cl2 
ON cl2.common_lookup_code = cl1.common_lookup_code 
INNER JOIN price p 
ON p.price_type = cl2.common_lookup_id 
AND r.check_out_date BETWEEN p.start_date 
    AND COALESCE(p.end_date, r.check_out_date) 
WHERE r.rental_id = ri.rental_id 
AND cl1.common_lookup_id = ri.rental_item_type 
AND p.item_id = ri.item_id 
관련 문제