2009-04-08 3 views
4

У меня есть две таблицы. Одним из них является простая строка/ID посмотреть:Обновление SQL с соединением?

StrTable:

 
str_key String 
0  'a' 
1  'b' 

где строки являются уникальными. Другой является более сложным, и включает в себя разделяемых string_id

ValTable:

 
str_key other_key val 
0  0  1.234 
0  1  1.567 
1  0  1.890 

Теперь я хочу сделать обновление на ValTable, используя строку, которую я Lookup, чтобы получить str_key через StrTable. Простое обновление будет:

UPDATE ValTable SET val = 2.124 WHERE str_key = 0 AND other_key = 1 LIMIT 1 
IF @@ROWCOUNT=0 INSERT INTO ValTable VALUES (0,1,2.124); 

Так как я могу изменить это включить, глядя вверх str_key с некоторой строкой «а»? Я предполагаю, что мне нужно присоединиться, но я никогда не делал присоединения к обновлению. Или я могу просто добавить больше к моей статье where?

+0

Вы не имеете DDL для таблиц, но при условии, что str_key и other_key составляют ПК для ValTable, есть причина того, что у вас есть «LIMIT 1»? Даже если это не ПК, кажется странным использовать LIMIT здесь –

+0

Я не был уверен, приведет ли он к развертке всей таблицы без ограничения, но я полагаю, что она достаточно умна, чтобы знать, что составной ключ * * * и влияет только на одну строку. –

ответ

14

Это синтаксис вам нужно:

UPDATE v 
SET  val = 2.124 
FROM ValTable v 
     INNER JOIN 
       StringTable s 
       ON v.str_key = s.str_key 
WHERE s.String = 'a' 
AND  v.other_key = 1 

IF @@ROWCOUNT = 0 
BEGIN 

     INSERT 
     INTO ValTable 
     SELECT str_key, 1, 2.124 
     FROM StringTable 
     WHERE String = 'a' 

END 
+0

Как изменить вторую строку? Могу ли я просто сделать это: IF @@ ROWCOUNT = 0 INSERT INTO v VALUES (v.str_key, 1, 2.124) Или мне нужно переопределить v.str_key, используя другое соединение? –

1

В приведенном выше примере Дэвид М действует и работает. В зависимости от размера таблицы вы можете избежать «Слепых обновлений», так как это может привести к проблемам с производительностью в ОЧЕНЬ больших таблицах. Обратите внимание на табличные подсказки в IF EXISTS().

IF EXISTS(
     SELECT 
      * 
     FROM 
      ValTable v WITH(NOLOCK) 
      INNER JOIN StringTable s WITH(NOLOCK) ON v.str_key = s.str_key 
     WHERE 
      s.String = 'a' 
     AND v.other_key = 1 
    ) 
BEGIN 
    UPDATE 
     v 
    SET  
     val = 2.124 
    FROM  
     ValTable v 
     INNER JOIN StringTable s ON v.str_key = s.str_key 
    WHERE 
     s.String = 'a' 
    AND v.other_key = 1 
END 
ELSE 
BEGIN 
    INSERT INTO ValTable 
     --(You should define your columns here, You didn't provide a sample schema so I don't know what your columns are.) 
     --(Col1,COl2,COl3,etc...) 
    SELECT 
     str_key, 1, 2.124 
    FROM  
     StringTable 
    WHERE 
     String = 'a' 
END