SQL- 다른 테이블을 기반으로 한 열 값 하나를 업데이트하십시오.
-
10-07-2019 - |
문제
제목이 설명만큼 설명하지 않으면 미안하지만 한 문장으로 내가하려는 내용을 설명하기가 어렵습니다.).
부모 객체를 각 자녀와 연결하는 테이블 하나가 있습니다. 그리고 나는 모든 물체 (부모와 자녀)가 각각의 이미지가있는 다른 테이블을 가지고 있습니다. 그러나 이미지는 부모 객체를 위해 설정됩니다. 이 마지막 테이블을 업데이트하고 Childs 이미지를 부모에게 이미 설정 한 동일한 이미지로 설정하고 싶습니다. 게다가 각 객체에 대해 둘 이상의 이미지가 있기 때문에 특히 속성 열을 기반으로 알 수있는 이미지를 설정하고 싶습니다.
내 테이블은 다음과 같습니다.
관계 가능한
어린이 ID
부모 -ID
imagetable
객체 -ID
속성 -ID
이미지 url
그리고 여기에 사물을 명확히하기 위해 예를 들어 있습니다.
relationstable
child-id | 부모 -ID
3 | 1
4 | 1
5 | 2
imagetable
객체 -ID | 속성 -ID | 이미지 url
1 | goodimage | image1.jpg
1 | Badimage | image1b.jpg
2 | goodimage | image2.jpg
2 | Badimage | image2b.jpg
3 | goodimage | 아니요
3 | Badimage | 아니요
4 | goodimage | 아니요
4 | Badimage | 아니요
5 | goodimage | 아니요
5 | Badimage | 아니요
따라서 객체 3, 4 및 5 (자식)의 이미지를 각 부모 이미지로 설정하지만 '올바른'이미지로 설정하고 싶습니다. 즉 'goodimage'가 attribute-id 인 이미지입니다.
결국 그것은 다음과 같아야합니다.
1 | goodimage | image1.jpg
1 | Badimage | image1b.jpg
2 | goodimage | image2.jpg
2 | Badimage | image2b.jpg
3 | goodimage | image1.jpg
3 | Badimage | 아니요
4 | goodimage | image1.jpg
4 | Badimage | 아니요
5 | goodimage | image2.jpg
5 | Badimage | 아니요
사실, 나는 'badimage'가 설정되어 있는지 상관하지 않지만 중요한 것은 'goodimage'입니다.
나는 다음과 같은 것을 시도하고 있습니다.
UPDATE ImageTable
SET image = (SELECT image-url FROM ImageTable WHERE ImageTable.object-id = RelationTable.parent-id AND ImageTable.attribute-id = 'goodimage')
WHERE ImageTable.object-id = RelationTable.child-id AND ImageTable.attribute-id = 'goodimage'
그러나 올바른 SQL 구문이 아니기 때문에 작동하지 않습니다. 변수를 사용해야하는지 (사용한 적이 없음) 하나의 SQL 문장으로 만 수행 할 수 있는지 모르겠습니다.
어떤 도움이든 큰 감사를드립니다.
해결책
이 같은?
메모:
이것은 하나의 비가 부적절한 진술로 병합 될 수 있지만 나는 게으르다.
나는 테스트하지 않았고 오타를 기대했다
;WITH goodlist AS
(
SELECT child-id, image-url
FROM relationstable
left join imagetable on relationstable.child-id = relationstable.child-id and attribute-id = "goodimage"
)
UPATE imagetable
set imagetable.image-url =
(SELECT top 1 image-url from goodlist where child-id = imagetable.object-id)
WHERE imagetable.image-url = "no"
다른 팁
우선, 부모와 자녀의 관계가 1 : n이라면 그 정보를 같은 테이블에 추가하지 않겠습니까? 예를 들어 FieldName "ParentId"(비어있는 경우/null이면 부모 일뿐입니다). 혜택 : 추가 테이블이 필요하지 않으며 필요한 경우 계층 구조를 쉽게 만들 수 있습니다.
그리고 이미지의 경우 코드 어딘가에 이것을 표시하고 싶다고 생각하지만, 부모의 이미지를 얻기 위해 선택을 수정하는 것이 더 쉬워야합니다. 혜택 : 새 항목을 얻을 때 테이블을 업데이트 할 필요가 없으며 일부 어린이 항목이 자신의 이미지를 가질 수도 있습니다 (필요한 경우).
편집 : 오픈 소스 프로젝트 부분에 대한 새로운 의견을 발견했습니다. 물론 데이터베이스 설계를 변경하기가 어렵습니다. 그러나 아마도 일부 문제를 프로그래밍 측면으로 옮기는 것이 여전히 더 쉽습니다 (오픈 소스 소프트웨어에 의해 처리되지 않는 한).