Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用联接进行SQL更新?_Sql_Sql Server 2005_Join_Sql Update - Fatal编程技术网

使用联接进行SQL更新?

使用联接进行SQL更新?,sql,sql-server-2005,join,sql-update,Sql,Sql Server 2005,Join,Sql Update,我有两张桌子。一种是简单的字符串/ID查找: 标准表格: str_key String 0 'a' 1 'b' 那么,我如何修改它以包括查找带有字符串“a”的str_键?我想我需要加入,但我从未在更新中加入过。或者我可以在where子句中添加更多内容吗?这是您需要的语法: UPDATE v SET val = 2.124 FROM ValTable v INNER JOIN StringTable s

我有两张桌子。一种是简单的字符串/ID查找:

标准表格:

str_key String 0 'a' 1 'b'
那么,我如何修改它以包括查找带有字符串“a”的str_键?我想我需要加入,但我从未在更新中加入过。或者我可以在where子句中添加更多内容吗?

这是您需要的语法:

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

David M的上述示例有效且有效。根据表的大小,您可能希望避免“盲更新”,因为这可能会导致非常大的表出现性能问题。请注意IF EXISTS()中的表提示


您的表没有DDL,但是假设str_键和other_键构成了您的ValTable的PK,您有“限制1”的原因吗?即使不是PK,在这里使用LIMIT似乎很奇怪我不确定它是否会导致在没有限制的情况下扫描整个表,但我想它足够聪明,知道复合键是键,并且只影响那一行。我如何修改第二行?我可以这样做吗:如果@ROWCOUNT=0,请插入v值(v.str_键,1,2.124),或者我需要使用另一个联接重新确定v.str_键吗?
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);
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
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