2016-06-30 5 views
-1

Я хочу обновить таблицу со значением другой таблицы. Но когда он не находит значение, я хочу вставить 999.SQL update select with if

Как я могу это сделать?

UPDATE [ORDRE] 
SET [LIB_TOURNE] = (SELECT TOP 1 LIB_TOURNE 
        FROM TOURNE 
        WHERE LE_COMMUNE like ORDRE.VILLE 
         AND (TYPE_TOURNE = datepart(dw,getdate()) OR 
          TYPE_TOURNE = 0) 
         AND (datepart(hh, HEURE_TOURNE) = datepart(hh, ORDRE.DATE_CLOTUR))) 

Это означает, что если синтаксис выбора не может найти значение, вместо этого я буду использовать значение 999.

+1

Какая СУБД для этого? Добавьте тег, чтобы указать, используете ли вы 'mysql',' postgresql', 'sql-server',' oracle' или 'db2' - или что-то еще. –

+0

Я думаю, что это утверждение обновляет все записи в таблице ORDRE. Вероятно, вы должны добавить оператор where, чтобы определить, какие записи вы хотите обновить. –

ответ

0

Вы можете использовать COALESCE или ISNULL (SQL Server) или NVL (Oracle), обернутый вокруг вашего SELECT заявления, чтобы проверить, если он не возвращается NULL или нет строк, а затем он будет двигаться к значению поставки.

UPDATE [ORDRE] 
SET [LIB_TOURNE] = COALESCE((SELECT TOP 1 LIB_TOURNE 
           FROM TOURNE 
           WHERE LE_COMMUNE LIKE ORDRE.VILLE 
            AND (TYPE_TOURNE = datepart(dw, getdate()) 
             OR TYPE_TOURNE = 0     ) 
            AND (datepart(hh, HEURE_TOURNE) = datepart(hh, ORDRE.DATE_CLOTUR)) 
          ), 999) 

Кроме того, в зависимости от размера таблиц, может быть более effiecient способ получить правильное значение LIB_TOURNE.

+1

COALESCE - лучший ответ здесь, его ANSI-SQL. – sagi

+0

@sagi это может зависеть от того, что вы делаете, 'COALESE' обрабатывает несколько аргументов и немного менее эффективен, чем одиночные проверки для' ISNULL' и 'NVL'. –

+2

Я знаю это, я имел в виду этот вопрос, потому что он не помечал свои РСУБД, поэтому вы не можете предоставить конкретный ответ продукта. @WyattShipman – sagi