2009-11-19 4 views
0

Есть ли более элегантный способ написать следующую команду Microsoft SQL Server 2008?Обновить поле на основе значений другой таблицы

UPDATE TableB 
SET TableBField2=0 
WHERE TableBID IN(
    SELECT TableBID 
    FROM TableB 
    JOIN TableA on TableB.TableAID=TableA.TableAID 
    WHERE TableBField2 < 0 
    AND TableAField1 = 0 
) 

Проще говоря, то, что я делаю, это обновление таблицы, основанной на значении поля в объединенной таблице. Интересно, не считается ли мое использование IN() неэффективным.

+0

Если вы можете определить эти данные из фактов в других частях системы, то почему бы хранить его в два раза? Теперь вам нужно будет запускать это обновление каждый раз, когда вы касаетесь TableA или TableB, потому что вычисленный результат мог быть изменен, и поэтому TableBField2 будет потенциально устаревшим. –

ответ

1

Это должно быть более эффективным:

UPDATE TableB b 
SET TableBField2=0 
WHERE exists (
    SELECT 1 
    FROM TableA 
    WHERE b.TableAID=TableA.TableAID 
    AND b.TableBField2 < 0 
    AND TableAField1 = 0 
) 
+0

Я думаю, что я поставлю WHERE b.TableBField2 <0 перед существованием –

1

Вы можете попробовать что-то вроде этого

UPDATE TableB 
SET Field2 = 0 
FROM TableB b INNER JOIN 
     TableA a ON b.TableB.TableAID=a.TableAID 
WHERE b.Field2 < 0  
AND a.Field1 = 0 
Смежные вопросы