2009-11-18 64 views
2

我不太清楚如何在SQL中执行此操作。在这里它是在伪代码:SQL中的Foreach?

  1. ,要考虑与内容类型X.
  2. 对于每个节点的节点列表,采取场Y的值
  3. INSERT INTO term_nodes VALUES((对应于Y TID ),4,(NID节点X))

的(TID对应于Y)由

SELECT `tid` FROM `term_data` WHERE `name` = Y 

(I给出的试图在Drupal 6中分配分类)。

我该怎么做?

回答

5

你不是真的想这样做一个foreach。不要将SQL视为程序性的,就像大多数代码一样(您只需要做一件事,然后再做一次,等等)。你需要把它看作基于集合的,你在哪里可以满足某些要求的大块。喜欢的东西:

INSERT INTO term_nodes (tid, x, nid) -- these are the field names 
<subquery that selects all the data> 

子查询应该只选择你要插入的数据,或许是这样的:

SELECT nodeId, 4, termId FROM nodes WHERE contentType = X 

所以把他们放在一起,你会得到:

INSERT INTO term_nodes (tid, x, nid) 
SELECT nodeId, 4, termId FROM nodes WHERE contentType = X 

无需尝试遍历子查询中的每个元素,并一次插入一个元素,只需一次完成所有元素。

这是我发现的一篇关于Procedural versus Set-Based SQL的好文章,可以帮助您更好地理解这个概念。

2

如果您可以使用常规SQL,您是否可以不使用INSERT/SELECT语句?

INSERT INTO term_nodes(fld, fld2, fld3) 
    SELECT tid, nodeid, 4 FROM term_data WHERE ... ? 
+0

是的,但我怎么做一个集合中的每个节点? – 2009-11-18 21:04:28

2
INSERT INTO `term_nodes` (fld1, fld2, fld3) 
     SELECT tn.`tid`, 4, n.`nid` 
     FROM `nodes` n 
     INNER JOIN `term_nodes` tn ON tn.`name`=n.`Y` 
     WHERE n.`ContentType`= X