2012-06-29 5 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 

); 

Мне нужен результат проверки, и я использовал следующий запрос, чтобы получить количество соответствующих идентификаторов. Я получил результат 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 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