SQL - 更新表根据另一个表更改一个列值

时间:2009-11-30 11:34:13

标签: sql select copy row sql-update

很抱歉,如果标题不像它应该的那样具有描述性,但很难用一句话解释我想要做什么;)。

我有一个表将父对象与其各自的子对象链接起来。我有另一张桌子,上面有所有物体(父母和孩子)及其各自的图像。但是,只为父对象设置图像。我想更新最后一个表并将childs图像设置为已为其父图像设置的图像。此外,由于每个对象有多个图像,我想特别设置一个,我可以根据属性列来了解它。

我的表格如下:

RelationTable

子-ID

父-ID

ImageTable

对象的id

属性-ID

图像-URL

这是一个例子,以澄清事情:

RelationsTable

child-id |父ID

3 | 1

4 | 1

5 | 2

ImageTable

object-id | attribute-id |图像-URL

1 | goodimage | image1.jpg

1 | badimage | image1b.jpg

2 | goodimage | image2.jpg

2 | badimage | image2b.jpg

3 | goodimage |无

3 | badimage |无

4 | goodimage |无

4 | badimage |无

5 | goodimage |无

5 | badimage |无

所以,我想将对象3,4和5(子对象)的图像设置为各自的父图像,但是设置为“正确”图像,即具有'goodimage'作为属性id的图像。

最后应该看起来像:

1 | goodimage | image1.jpg

1 | badimage | image1b.jpg

2 | goodimage | image2.jpg

2 | badimage | image2b.jpg

3 | goodimage | image1.jpg

3 | badimage |无

4 | goodimage | image1.jpg

4 | badimage |无

5 | goodimage | image2.jpg

5 | badimage |无

实际上,我并不关心'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 :(得分:0)

首先,如果父和子之间的关系是1:n,为什么不将这些信息添加到同一个表中?例如fieldname“parentid”(如果它为空/ null,它只是父级)。好处:您不需要额外的表,并且可以根据需要轻松创建层次结构。

对于图像,我想你想在你的代码中的某个地方显示它,但是应该更容易修改SELECT以获得父亲的图像 - 网址没有为孩子提供图像。好处:当您获得新条目时无需更新表格,并且某些子条目也可以拥有自己的图像(如果需要)。

编辑:刚刚注意到你对开源项目部分的新评论,当然这使得很难改变数据库设计。但也许将一些问题转移到编程方面仍然更容易(除非这也是由开源软件处理的)。

答案 1 :(得分:0)

这样的事情?

注意:

这可以合并为一个    非子查询声明,但我是    懒惰。

我没有测试,期待拼写错误

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