SQL: tabella di aggiornamento che modifica il valore di una colonna in base a un'altra tabella

StackOverflow https://stackoverflow.com/questions/1819295

Domanda

Scusate se il titolo non è così descrittivo come dovrebbe essere, ma è difficile spiegare in una frase cosa sto cercando di fare;).

Ho una tabella che collega gli oggetti padre con i loro rispettivi figli. E ho un altro tavolo con tutti gli oggetti (genitori e figli) con le sue immagini rispettose. Tuttavia, l'immagine è appena impostata per gli oggetti genitori. Vorrei aggiornare quest'ultima tabella e impostare l'immagine del bambino la stessa immagine che è già impostata per il suo genitore. Inoltre, poiché esiste più di un'immagine per ogni oggetto, vorrei impostarne una in particolare, che posso conoscere in base a una colonna di attributi.

I miei tavoli sembrano:

RelationTable

bambino-id

genitore-id

ImageTable

object-id

attributo-id

immagine-url

Ed ecco un esempio per chiarire le cose:

RelationsTable

id-figlio | genitore-id

3 | 1

4 | 1

5 | 2

ImageTable

id-oggetto | attributo-id | immagine-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

Quindi, vorrei impostare le immagini degli oggetti 3, 4 e 5 (quelle secondarie) sulle rispettive immagini principali, ma su quelle "corrette", ovvero le immagini con "goodimage" come attributo-id.

Alla fine dovrebbe apparire come:

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

In realtà, non mi importa se è impostato anche 'badimage', ma quello importante è 'goodimage'.

Ho provato qualcosa del tipo:

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'

ma non funziona poiché non è una sintassi SQL corretta. Non so se dovrei usare una variabile (mai usata) o se questo può essere fatto con una sola frase SQL.

Qualsiasi aiuto sarebbe molto apprezzato.

È stato utile?

Soluzione

qualcosa del genere?

NOTE:

Questo potrebbe essere unito in uno    dichiarazione non di subquery ma lo ero    pigro.

Non ho testato, mi aspetto errori di battitura

;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"

Altri suggerimenti

Prima di tutto, se la relazione tra genitore e figlio è 1: n, perché non aggiungi semplicemente queste informazioni alla stessa tabella? per esempio. nome campo " parentid " (se è vuoto / null è solo un genitore). Vantaggio: non è necessaria una tabella aggiuntiva e, se necessario, è possibile creare facilmente una gerarchia.

E per l'immagine, immagino che tu voglia visualizzarlo da qualche parte nel tuo codice, ma dovrebbe essere più semplice semplicemente modificare SELEZIONA per ottenere l'URL dell'immagine del genitore se non viene data alcuna immagine per il bambino. Vantaggio: non è necessario aggiornare la tabella quando si ottengono nuove voci e sarebbe anche possibile per alcune voci figlio avere la propria immagine (se necessario).

modifica: ho appena notato il tuo nuovo commento sulla parte del progetto open-source, ovviamente questo rende difficile cambiare il design del database. Ma forse è ancora più semplice spostare alcuni dei problemi sul lato della programmazione (a meno che anche questo non sia gestito dal software open source).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top