2012-06-29 58 views
0

我尝试使用以下查询更新表中的列。在那种情况下,更新32000行。为什么这两个sql的结果不同

Update Table72D012 t2 set DEFINING_ARGUMENT_ID = 
(
SELECT t3.ID 
FROM  Table70t3 t3, 
     Table70t1 t1, 
     Table70t0 t0,   
     Table4 t4 
WHERE t2.Model_id = t4.ID 
AND  t3.ID = t1.PARAM_VALUE_BPVA_ID 
AND  t3.VALUE_BPAR_ID = t0.ID 
AND  t0.KEY='SPECIAL_KEY' 
AND  t1.LANGUAGE='en' 
AND  t4.Model = t1.name 

); 

我想检查结果,我用下面的查询来获得相关ID的计数。我得到了26500结果..为什么结果(更新计数和选择结果计数)彼此不同?
我该如何纠正UPDATE查询?

只能选择

SELECT t3.ID 
FROM  Table70t3 t3, 
     Table70t1 t1, 
     Table70t0 t0, 
     Table72D012 t2, 
     Table4 t4 
WHERE t2.Model_id = t4.ID 
AND  t3.ID = t1.PARAM_VALUE_BPVA_ID 
AND  t3.VALUE_BPAR_ID = t0.ID 
AND  t0.KEY='SPECIAL_KEY' 
AND  t1.LANGUAGE='en' 
AND  t4.Model = t1.name 
+0

您确实在一个查询中有't0.key ='ORDN',而另一个查询中是否有't0.key ='SPECIAL_KEY''? –

+0

我错过了什么吗?在你的更新中,你使用't0.KEY ='ORDN'',但是当你选择时,你使用't0.KEY ='SPECIAL_KEY''? – LittleBobbyTables

+0

这是一个打字错误,两个键都是SPECIAL_KEY – Kayser

回答

3

首先,你需要了解正确的联接语法。在WHERE子句中进行连接是一个糟糕的主意。

原因很简单。第一个查询是在表中更新非常行,因为您没有WHERE子句或其他条件。

第二个查询返回与查询匹配的所有行。在更新版本中,这些行将获得NULL值。

这是很好的语法,通过MS SQL,但不支持DB2:

Update Table72D012 t2 
    set DEFINING_ARGUMENT_ID = t3.ID 
    from (SELECT t4.id as t4_id, t3.ID 
      FROM Table70t3 t3 join 
       Table70t1 t1 
       on t3.ID = t1.PARAM_VALUE_BPVA_ID join 
       Table70t0 t0 
       on t3.VALUE_BPAR_ID = t0.ID join 
       Table4 t4 
       on t4.Model = t1.name 
      WHERE t0.KEY='SPECIAL_KEY' AND t1.LANGUAGE='en' 
     ) t 
    WHERE t2.Model_id = t4_ID 

我不认为DB2允许在一个UPDATE子句,所以你需要的东西是这样的:

Update Table72D012 t2 
    set DEFINING_ARGUMENT_ID = 
     (SELECT t3.ID 
      FROM Table70t3 t3 join 
       Table70t1 t1 
       on t3.ID = t1.PARAM_VALUE_BPVA_ID join 
       Table70t0 t0 
       on t3.VALUE_BPAR_ID = t0.ID join 
       Table4 t4 
       on t4.Model = t1.name 
      WHERE t0.KEY='SPECIAL_KEY' AND t1.LANGUAGE='en' and t2.Model_id = t4.ID 
     ) 
    WHERE exists    
     (SELECT t3.ID 
      FROM Table70t3 t3 join 
       Table70t1 t1 
       on t3.ID = t1.PARAM_VALUE_BPVA_ID join 
       Table70t0 t0 
       on t3.VALUE_BPAR_ID = t0.ID join 
       Table4 t4 
       on t4.Model = t1.name 
      WHERE t0.KEY='SPECIAL_KEY' AND t1.LANGUAGE='en' and t2.Model_id = t4.ID 
     ) 
+0

我错过了。好的! –

+0

你是什么意思“非常行”?我需要哪里条件?它不会自动识别吗? – Kayser

+0

感谢您的回答。我该如何纠正更新查询? – Kayser

相关问题