2009-11-18 65 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