代码之家  ›  专栏  ›  技术社区  ›  Phil H

使用联接进行SQL更新?

  •  4
  • Phil H  · 技术社区  · 17 年前

    StrTable:

    str_key String
    0       'a'
    1       'b'
    

    其中字符串是唯一的。另一个更复杂,包括共享的string_id

    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子句中添加更多内容吗?

    2 回复  |  直到 14 年前
        1
  •  14
  •   David M    17 年前

    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
    
        2
  •  1
  •   DBAndrew    17 年前

    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