SQL - Table de mise à jour modifiant une valeur de colonne en fonction d'une autre table
-
10-07-2019 - |
Question
Désolé si le titre n’est pas aussi descriptif qu’il le devrait mais il est assez difficile d’expliquer en une phrase ce que j’essaie de faire;).
J'ai une table qui relie les objets parents à leurs enfants respectifs. Et j'ai une autre table avec tous les objets (parents et enfants) avec ses images respectives. Cependant, l'image est simplement définie pour les objets parents. Je voudrais mettre à jour ce dernier tableau et définir l'image de Childs la même image qui est déjà définie pour son parent. De plus, comme il y a plus d'une image pour chaque objet, j'aimerais en définir une en particulier, que je peux connaître en fonction d'une colonne d'attributs.
Mes tables ressemblent à quelque chose comme:
RelationTable
id-enfant
parent-id
Table des images
id-objet
attribut-id
URL de l'image
Et voici un exemple pour clarifier les choses:
Table des relations
id-enfant | parent-id
3 | 1
4 | 1
5 | 2
Table des images
object-id | attribut-id | URL de l'image
1 | goodimage | image1.jpg
1 | badimage | image1b.jpg
2 | goodimage | image2.jpg
2 | badimage | image2b.jpg
3 | goodimage | non
3 | badimage | non
4 | goodimage | non
4 | badimage | non
5 | goodimage | non
5 | badimage | non
Je souhaite donc que les images des objets 3, 4 et 5 (enfants) soient définies sur leurs images parent respectives, mais sur les images "correctes", à savoir les images avec "goodimage" comme attribut-id.
À la fin, il devrait ressembler à:
1 | goodimage | image1.jpg
1 | badimage | image1b.jpg
2 | goodimage | image2.jpg
2 | badimage | image2b.jpg
3 | goodimage | image1.jpg
3 | badimage | non
4 | goodimage | image1.jpg
4 | badimage | non
5 | goodimage | image2.jpg
5 | badimage | non
En fait, je me fiche de savoir si "badimage" est également défini, mais le plus important est "goodimage".
J'ai essayé quelque chose comme:
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'
mais cela ne fonctionne pas car ce n'est pas la syntaxe SQL correcte. Je ne sais pas si je devrais utiliser une variable (jamais utilisée) ou si cela peut être fait avec une seule phrase SQL.
Toute aide serait très appréciée.
La solution
quelque chose comme ça?
NOTES:
Ceci pourrait être fusionné en un déclaration non-sous-requête mais j'étais paresseux.
Je n'ai pas testé, j'attends des fautes de frappe
;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"
Autres conseils
Tout d’abord, si la relation parent-enfant est 1: n, pourquoi ne pas simplement ajouter cette information à la même table? par exemple. nom de champ " parentid " (si c'est vide / null c'est seulement un parent). Avantage: vous n'avez pas besoin d'une table supplémentaire et vous pouvez facilement créer une hiérarchie si nécessaire.
Et pour l’image, je suppose que vous voulez l’afficher quelque part dans votre code, mais il devrait être plus facile de modifier le SELECT afin d’obtenir l’image-url du parent; aucune image n’est donnée pour l’enfant. Avantage: pas besoin de mettre à jour la table lorsque vous obtenez de nouvelles entrées et il serait également possible que certaines entrées enfants aient leur propre image (si nécessaire).
edit: vous venez de remarquer votre nouveau commentaire sur la partie de projet open-source, bien sûr, cela rend difficile la modification de la conception de la base de données. Mais il est peut-être encore plus facile de déplacer certains problèmes du côté de la programmation (à moins que cela ne soit également géré par le logiciel open source).