2011-10-30 4 views
0

두 개의 테이블이 있다고 가정 해보십시오.이 SQL UPDATE 쿼리는 어떻게 작성합니까?

new_dogs <<---- CONTAINS DOGS SPOTTED TODAY 
--------- 
name 
breed 
color 
location 
found_date 

dog_locations <<---- CONTAINS A HISTORY OF ALL DOGS EVER SPOTTED 
--------------- 
name 
breed 
location 
from_date 
thru_date 

new_dogs 테이블은 오늘 발견 된 개로 채워집니다. 공원에서 3 일 연속으로 최대라는 흰색 푸들을 발견했다고 가정 해 봅시다. 첫날, max는 found_date의 from_date가있는 공원의 dog_locations 테이블에 삽입됩니다.

2 일째 최대는 여전히 공원에서 나타납니다. 그래서 아무것도 할 필요가 없습니다.

3 일째 max는 더 이상 new_dogs 테이블 (dogs_found_today 테이블이라고도 함)에 없습니다. 공원. 즉, dog_locations의 항목이 더 이상 유효하지 않으므로 thru_date를 닫고 싶습니다.

내가해야 할 일은 dog_locations 테이블에있는 개에 thru_date를 업데이트하는 것이지만 new_dogs 테이블에는 존재하지 않으며 thru_date는 NULL입니다. thru_date는 CURRENT_DATE()로 설정됩니다.

각 dog_location은 기본 키가 (name, breed; location; from_date)와 고유해야합니다.

이 문제를 해결하는 방법을 모르겠습니다.

dog_locations에는 있지만 다음과 같이 new_dogs에는없는 개를 선택할 수 있습니다.

SELECT name, breed, location, from_date 
FROM dog_locations dl 
WHERE NOT EXISTS (SELECT name, breed, location, found_date 
       FROM new_dogs nd 
       WHERE (nd.name = dl.name) AND (nd.breed = dl.breed) 
            AND (nd.location = dl.location) 
            AND (nd.found_date = dl.from_date)); 
+0

dog_locations에 있었고 new_dogs에 있던 모든 개를 선택할 수 있었지만 업데이트를 연결할 수 없었습니다. – MikeJerome

+0

뭔가 명확히하십시오 : new_dogs 테이블에서 발생하지 않는 개를 업데이트했지만 새 thru_date로 new_dogs.found_date를 사용한다고 말했습니까? 그 개에 대한 기록이 없다면 어떻게 그 발견 날짜를 사용할 수 있습니까? – davidethell

+0

@davidethell 질문을 CURRENT_DATE()로 설정해야한다고 말했습니다. – MikeJerome

답변

1
UPDATE dog_locations SET thru_date = <actualdate or whichever date> 
FROM dog_locations dl 
WHERE NOT EXISTS (SELECT name, breed, location, found_date 
       FROM new_dogs nd 
       WHERE (nd.name = dl.name) AND (nd.breed = dl.breed) 
            AND (nd.location = dl.location) 
            AND (nd.found_date = dl.from_date)); 

건배 가 안자

을하지만 당신은 정말 데이터베이스 설계를 재고하고 LukLeds 아이디어를 따라야합니다 테이블 개 도입 ...

+0

굉장히 잘됐다! – MikeJerome

관련 문제