SQL - Update Tabelle Ändern eines Spaltenwert basierend auf einer anderen Tabelle
-
10-07-2019 - |
Frage
Sorry, wenn der Titel nicht als beschreibend ist, wie es sein soll, aber es ist etwas schwierig in einem Satz zu erklären, was ich zu tun versuchen.;)
Ich habe eine Tabelle, die übergeordneten Objekte mit ihrem jeweiligen Kind verbindet. Und ich habe eine andere Tabelle mit allen Objekten (Eltern und Kinder) mit seinen respectives Bilder. Allerdings wird das Bild nur für die Eltern-Objekte festgelegt. Ich mag diese letzte Tabelle aktualisieren und das Childs Bild das gleiche Bild gesetzt, das bereits für seine Eltern festgelegt ist. Außerdem, wie es für jedes Objekt mehr als ein Bild ist, ich mag eine insbesondere setzen, die ich auf der Grundlage einer Attributspalte wissen kann.
Meine Tabellen in etwa so aussehen:
RelationTable
Kind-id
Eltern-ID
ImageTable
Objekt-ID
Attribut-ID
image-url
Und hier geht ein Beispiel, um die Dinge zu klären:
RelationsTable
Kind-id | Eltern-ID
3 | 1
4 | 1
5 | 2
ImageTable
Objekt-ID | Attribut-ID | Bild-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
So würde Ich mag die Bilder von Objekten 3 setzen, 4 und 5 (Kind ist) zu ihren jeweiligen Mutter Bildern, sondern auf die ‚richtig‘ diejenigen, dh die Bilder mit ‚goodimage‘ als Attribut-ID.
Am Ende sollte es wie folgt aussehen:
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
Eigentlich ist mir egal, wenn ‚badimage‘ als auch gesetzt ist, aber das Wichtigste ist ‚goodimage‘.
Ich habe versucht, so etwas wie:
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'
, aber es funktioniert nicht, da es nicht richtig SQL-Syntax ist. Ich weiß nicht, ob ich eine Variable verwendet werden soll (nie verwendet) oder, wenn dies mit nur einem SQL-Satz durchgeführt werden.
Jede Hilfe wäre sehr geschätzt werden.
Lösung
so etwas wie das?
NOTES:
Dies könnte zu einem verschmolzen werden Nicht-Unterabfrage Aussage, aber ich war faul.
Ich habe nicht getestet, erwarten Tippfehler
;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"
Andere Tipps
Vor allem, wenn die Beziehung zwischen Eltern und Kind ist 1: n, warum fügen Sie nicht nur diese Information an den gleichen Tisch? z.B. Feldname „parentid“ (wenn es leer / null, es ist nur ein Elternteil). Vorteil:. Sie benötigen keine zusätzliche Tabelle benötigen und können leicht eine Hierarchie schaffen, wenn nötig
Und für das Bild, ich denke, man das irgendwo im Code angezeigt werden soll, aber es soll einfacher sein, nur die SELECT ändert die Bild-URL der Eltern zu bekommen, ist kein Bild für das Kind gegeben wird. Vorteil:. Keine Notwendigkeit, die Tabelle zu aktualisieren, wenn neue Einträge erhalten, und es wäre auch möglich sein, für einige Kind Einträge ihr eigenes Bild zu haben (falls erforderlich)
edit: gerade Ihren neuen Kommentar über den Open-Source-Projekt ist Teil bemerkt, natürlich das es schwer, das Datenbank-Design zu ändern macht. Aber vielleicht ist es noch einfacher, einige der Probleme, auf die Programmierseite zu bewegen (es sei denn, dies durch die Open-Source-Software behandelt wird als auch).