Обновление SQL с объединением? - PullRequest
4 голосов
/ 08 апреля 2009

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

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, используя строку, которую я ищу, чтобы получить 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 с некоторой строкой 'a'? Я предполагаю, что мне нужно объединение, но я никогда не делал объединение в обновлении. Или я могу просто добавить больше в мое предложение where?

Ответы [ 2 ]

14 голосов
/ 08 апреля 2009

Это синтаксис, который вам нужен:

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 голос
/ 08 апреля 2009

Приведенный выше пример Дэвида М. действителен и работает. В зависимости от размера вашей таблицы вы можете избежать «слепых обновлений», так как это может вызвать проблемы с производительностью на ОЧЕНЬ больших таблицах. Обратите внимание на табличные подсказки в 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
...