SQL - обновить таблицу, меняя значение одного столбца на основе другой таблицы - PullRequest
0 голосов
/ 30 ноября 2009

Извините, если название не такое описательное, как должно быть, но в одном предложении довольно сложно объяснить, что я пытаюсь сделать;).

У меня есть одна таблица, которая связывает родительские объекты с соответствующими дочерними объектами. И у меня есть еще одна таблица со всеми объектами (родители и дети) с соответствующими изображениями. Тем не менее, изображение просто установлено для родительских объектов. Я хотел бы обновить эту последнюю таблицу и установить для дочернего изображения то же изображение, которое уже установлено для его родителя. Кроме того, поскольку для каждого объекта имеется более одного изображения, я бы хотел установить одно конкретное, которое я могу знать по столбцу атрибута.

Мои таблицы выглядят примерно так:

RelationTable

ребенок-идентификатор

родитель-идентификатор

ImageTable

ID объекта

атрибут-идентификатор

изображения URL

А вот пример, чтобы прояснить ситуацию:

RelationsTable

child-id | родитель-идентификатор

3 | 1

4 | 1

5 | 2

ImageTable

идентификатор объекта | идентификатор атрибута | изображения URL

1 | Goodimage | image1.jpg

1 | плохое изображение | image1b.jpg

2 | Goodimage | image2.jpg

2 | плохое изображение | image2b.jpg

3 | Goodimage | нет

3 | плохое изображение | нет

4 | Goodimage | нет

4 | плохое изображение | нет

5 | Goodimage | нет

5 | плохое изображение | нет

Итак, я хотел бы установить изображения объектов 3, 4 и 5 (дочерние) на соответствующие родительские изображения, но на «правильные», то есть изображения с «goodimage» в качестве атрибут-идентификатора.

В конце оно должно выглядеть так:

1 | Goodimage | image1.jpg

1 | плохое изображение | image1b.jpg

2 | Goodimage | image2.jpg

2 | плохое изображение | image2b.jpg

3 | Goodimage | image1.jpg

3 | плохое изображение | нет

4 | Goodimage | image1.jpg

4 | плохое изображение | нет

5 | Goodimage | image2.jpg

5 | плохое изображение | нет

На самом деле, мне все равно, установлен ли 'badimage', но важным является 'goodimage'.

Я пытался что-то вроде:

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'

но это не работает, так как это неправильный синтаксис SQL. Я не знаю, следует ли мне использовать переменную (никогда не использованную) или это можно сделать всего одним предложением SQL.

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

0 голосов
/ 01 декабря 2009

как то так?

ПРИМЕЧАНИЯ:

Это может быть объединено в одно утверждение не подзапроса, но я был ленивый.

Я не тестировал, ожидаю опечаток

;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"
0 голосов
/ 30 ноября 2009

Прежде всего, если отношение между родителем и потомком равно 1: n, почему бы вам просто не добавить эту информацию в одну и ту же таблицу?например, имя поля "parentid" (если оно пустое / пустое, то это только родитель).Преимущество: вам не нужна дополнительная таблица, и вы можете легко создать иерархию, если это необходимо.

И для изображения, я думаю, вы хотите отобразить это где-то в своем коде, но это должно быть проще просто изменитьSELECT для получения URL-адреса родителя - это не изображение для ребенка.Преимущество: нет необходимости обновлять таблицу, когда вы получаете новые записи, и для некоторых дочерних записей также было бы возможно иметь свое собственное изображение (при необходимости).

edit: только что заметил ваш новый комментарий об открытии- часть проекта, конечно, это затрудняет изменение дизайна базы данных.Но, возможно, все еще проще перенести некоторые проблемы на сторону программирования (если это не решается также с помощью программного обеспечения с открытым исходным кодом).

...