SQL: actualizar la tabla cambiando el valor de una columna en función de otra tabla
-
10-07-2019 - |
Pregunta
Lo siento si el título no es tan descriptivo como debería ser, pero es un poco difícil explicar en una oración lo que estoy tratando de hacer;).
Tengo una tabla que vincula los objetos principales con sus respectivos hijos. Y tengo otra tabla con todos los objetos (padres e hijos) con sus respectivas imágenes. Sin embargo, la imagen solo está configurada para los objetos padres. Me gustaría actualizar esta última tabla y configurar la imagen del niño la misma imagen que ya está configurada para su padre. Además, como hay más de una imagen para cada objeto, me gustaría establecer una en particular, que puedo saber en función de una columna de atributos.
Mis tablas se parecen a:
Tabla de relaciones
id de niño
identificación del padre
ImageTable
id-objeto
id. de atributo
imagen-url
Y aquí va un ejemplo para aclarar las cosas:
Tabla de relaciones
id-niño | identificación del padre
3 | 1
4 | 1
5 | 2
ImageTable
id-objeto | ID de atributo | image-url
1 | goodimage | image1.jpg
1 | badimage | image1b.jpg
2 | goodimage | image2.jpg
2 | badimage | image2b.jpg
3 | goodimage | no
3 | badimage | no
4 | goodimage | no
4 | badimage | no
5 | goodimage | no
5 | badimage | no
Entonces, me gustaría establecer las imágenes de los objetos 3, 4 y 5 (secundarios) a sus respectivas imágenes principales, pero a las 'correctas', es decir, las imágenes con 'buena imagen' como id de atributo.
Al final debería verse así:
1 | goodimage | image1.jpg
1 | badimage | image1b.jpg
2 | goodimage | image2.jpg
2 | badimage | image2b.jpg
3 | goodimage | image1.jpg
3 | badimage | no
4 | goodimage | image1.jpg
4 | badimage | no
5 | goodimage | image2.jpg
5 | badimage | no
En realidad, no me importa si 'badimage' también está configurado, pero el importante es 'goodimage'.
He intentado 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'
pero no funciona ya que no es la sintaxis SQL correcta. No sé si debería usar una variable (nunca usé una) o si esto se puede hacer con una sola oración SQL.
Cualquier ayuda sería muy apreciada.
Solución
algo como esto?
NOTAS:
Esto podría fusionarse en uno declaración no subconsulta pero estaba perezoso.
No probé, espero errores tipográficos
;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"
Otros consejos
En primer lugar, si la relación entre padre e hijo es 1: n, ¿por qué no agrega esa información a la misma tabla? p.ej. nombre de campo " parentid " (si está vacío / nulo es solo un padre). Beneficio: no necesita una tabla adicional y puede crear fácilmente una jerarquía si es necesario.
Y para la imagen, supongo que desea mostrar esto en algún lugar de su código, pero debería ser más fácil simplemente modificar SELECT para obtener la url de la imagen del padre si no se proporciona ninguna imagen para el hijo. Beneficio: no es necesario actualizar la tabla cuando obtiene nuevas entradas y también sería posible que algunas entradas secundarias tengan su propia imagen (si es necesario).
editar: acabo de notar su nuevo comentario sobre la parte del proyecto de código abierto, por supuesto, esto hace que sea difícil cambiar el diseño de la base de datos. Pero quizás aún sea más fácil trasladar algunos de los problemas al lado de la programación (a menos que esto también sea manejado por el software de código abierto).