2009-04-08 76 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的更新,利用我通過查找到StrTable得到str_key的字符串。簡單的更新將是:

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); 

那麼我該如何修改這個包括查找帶有一些字符串'a'的str_key?我想我需要一個連接,但我從來沒有參加過更新。或者我可以在我的where子句中添加更多內容嗎?

+0

你沒有DDL爲你的表,但假設str_key和other_key組成你的ValTable的PK,是否有一個原因,你有「極限1」?即使它不是PK,在這裏使用LIMIT似乎很奇怪 – 2009-04-08 11:15:53

+0

我不確定是否會導致整個表掃描沒有限制,但我想它足夠聰明,以知道複合鍵是* *鍵隻影響一行。 – 2009-04-08 13:04:07

回答

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 
1

上面的例子由David M是有效和作品。根據您的表的大小,您可能需要避免「盲目更新」,因爲這可能會導致在非常大的表上出現性能問題。請注意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