SQL - Atualização tabela de mudança de um valor de coluna com base em outra tabela
-
10-07-2019 - |
Pergunta
Desculpe se o título não é tão descritivo como deveria ser, mas é meio difícil de explicar em uma frase o que eu estou tentando fazer;).
Eu tenho uma tabela que as ligações objetos pai com seus respectivos criança. E eu tenho outra tabela com todos os objetos (pais e dos childs) com suas imagens respectives. No entanto, a imagem é apenas um conjunto para os objetos pais. Gostaria de atualizar esta última mesa e definir a imagem da criança a mesma imagem que já está definido para seu pai. Além disso, como há mais de uma imagem para cada objeto, eu gostaria de definir um em especial, que eu posso saber com base em uma coluna de atributo.
As minhas mesas algo como:
RelationTable
criança-id
pai-id
ImageTable
object-id
atributo-id
image-url
E aqui vai um exemplo, a fim de esclarecer as coisas:
RelationsTable
criança-id | pai-id
3 | 1
4 | 1
5 | 2
ImageTable
object-id | atributo-id | image-url
1 | goodimage | image1.jpg
1 | badimage | image1b.jpg
2 | goodimage | image2.jpg
2 | badimage | image2b.jpg
3 | goodimage | Não
3 | badimage | Não
4 | goodimage | Não
4 | badimage | Não
5 | goodimage | Não
5 | badimage | Não
Então, eu gostaria de definir as imagens de objetos 3, 4 e 5 (as crianças) para suas respectivas imagens pais, mas para os 'corretas', isto é as imagens com 'goodimage' como atributo-id.
No final ele deve ser parecido:
1 | goodimage | image1.jpg
1 | badimage | image1b.jpg
2 | goodimage | image2.jpg
2 | badimage | image2b.jpg
3 | goodimage | image1.jpg
3 | badimage | Não
4 | goodimage | image1.jpg
4 | badimage | Não
5 | goodimage | image2.jpg
5 | badimage | Não
Na verdade, eu não me importo se 'badimage' é definido como bem, mas o importante é 'goodimage'.
Eu tenho tentado algo como:
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'
Mas não é trabalhar uma vez que não é a sintaxe SQL correta. Eu não sei se eu deveria usar uma variável (nunca usado) ou se isso pode ser feito com apenas uma frase SQL.
Qualquer ajuda seria muito apreciada.
Solução
algo assim?
NOTAS:
Esta poderia ser fundidos em um declaração não subconsulta mas eu estava preguiçoso.
Eu não teste, esperar erros
;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"
Outras dicas
Em primeiro lugar, se a relação entre pai e filho é 1: n, por que você não basta adicionar essa informação para a mesma mesa? por exemplo. fieldname "parentid" (se ele está vazio / null é apenas um dos pais). Benefício:. Você não precisa de uma tabela adicional e pode facilmente criar uma hierarquia, se necessário
E para a imagem, eu acho que você quer mostrar este em algum lugar no seu código, mas deve ser mais fácil simplesmente modificar o SELECT para obter a imagem-url do pai há imagem é dado para a criança. Benefício:. Não há necessidade de atualizar a tabela quando você começa novas entradas e também seria possível para algumas entradas criança a ter sua própria imagem (se necessário)
edit: só ??notei o seu novo comentário sobre a parte do projeto de código aberto, é claro que isso faz com que seja difícil de alterar o design de banco de dados. Mas talvez seja ainda mais fácil mover alguns dos problemas para o lado de programação (a menos que isso é tratado pelo software de código aberto também).