2015-01-14 2 views
0

Как обновить таблицу с Select в том, где пунктобновление DataTable с выберите

Пример:

UPDATE 
    cp_asseteventinquiry 
SET 
    cp_asseteventinquiry.Due_Date = date_format (curdate(), '%m/%d/%Y') 

Where (Results of Below Query) 

SELECT 
    Distinct(TopLevelAsset_Num) 
FROM cp_asseteventinquiry 
WHERE 
    cp_asseteventinquiry.History='NO' 
    AND NOT EXISTS(
     SELECT * 
     FROM flightlogs 
     WHERE 
      flightlogs.Asset=cp_asseteventinquiry.TopLevelAsset_Num 
      AND flightlogs.Scheduled_Date=date_format (curdate(), '%m/%d/%Y') 
    ); 
+0

Пожалуйста, выберите 1 СУБД. Вы работаете с MySql или SqlServer? – paqogomez

+0

Почему в инструкции SELECT есть parens вокруг 'TopLevelAsset_Num'? Почему значения даты хранятся в столбцах, которые являются символьными типами данных, а не типом DATE? Почему существует пробел между именем функции 'DATE_FORMAT' и paren? – spencer7593

ответ

0

Используйте left join вместо:

UPDATE cp_asseteventinquiry ai LEFT JOIN 
     (SELECT TopLevelAsset_Num 
     FROM cp_asseteventinquiry ai2 
     WHERE ai2.History = 'NO' AND 
       NOT EXISTS (SELECT 1 
          FROM flightlogs fl 
          WHERE fl.Asset = ai2.TopLevelAsset_Num AND 
           fl.Scheduled_Date = curdate() 
         ) 
    ) tai 
     ON ai.TopLevelAsset_Num = ai2.TopLevelAsset_Num 
    SET ai.Due_Date = curdate() 
WHERE ai2.TopLevelAsset_Num IS NULL; 

Чем больше проблема заключается в том, почему вы форматируете даты как строка. Всегда сохраняйте даты в базе данных с использованием собственных форматов. Если у вас есть, чтобы сохранить даты в виде строки, используйте формат yyyy-mm-dd, поэтому строку можно упорядочить правильно.

+0

Некоторые, как это не работает –

+0

Требование: Получить список элементов, которые необходимо обновить, используя запрос выбора. Затем обновите элементы, которые являются результатом Select Query –

0

Это не совсем понятно, что вы пытаетесь достичь, но вы можете использовать запрос следующим образом:

UPDATE cp_asseteventinquiry a 
    LEFT 
    JOIN flightlogs f 
    ON f.Asset = a.TopLevelAsset_Num 
    AND f.Scheduled_Date = DATE_FORMAT(CURDATE(), '%m/%d/%Y') 
    SET a.Due_Date = DATE_FORMAT(CURDATE(), '%m/%d/%Y') 
WHERE a.History='NO' 
    AND f.Asset IS NULL 

Чтобы установить Due_Date столбец на каждой строке, которая имеет значение 'NO' в History колонке, и которая не имеет соответствующей строки в таблице flightlogs, которая удовлетворяет указанным условиям.

Непонятно, почему вам нужно форматировать даты в определенном формате, если они не хранятся в столбцах типа символов, что совершенно непривычно, учитывая, что MySQL имеет тип данных, предназначенный для хранения значений даты, DATE тип данных.


ПРИМЕЧАНИЕ: Не ставьте скобки вокруг выражений, где они не нужны, особенно если они не добавляют никакого смысла. Например, круглые скобки в данном контексте не имеет никакого значения:

SELECT DISTINCT(TopLevelAsset_Num) ... 

Это эквивалентно тому, что мы обычно используем,

SELECT DISTINCT TopLevelAsset_Num ... 

(Добавление скобок смешения делают вид, будто DISTINCT является функцией, принимает аргумент. DISTINCT не является функция, это ключевое слово. И это относится ко всем выражениям в списке выбора, это не имеет значения, является ли столбцы, завернутыми в круглых скобках.


Followup

Единственная причина, я могу видеть, чтобы вы получите четкий список TopLevelAsset_Num, является то, что некоторые из строк с одинаковым значением имеют History='NO' и друга нет. И вы хотите обновить все строк с соответствующими TopLevelAsset_Num.

В этом случае используйте вложенное представление, чтобы получить список, и выполнить операцию присоединения:

UPDATE cp_asseteventinquiry a 
    JOIN (SELECT n.TopLevelAsset_Num 
      FROM cp_asseteventinquiry n 
      LEFT 
      JOIN flightlogs f 
      ON f.Asset = n.TopLevelAsset_Num 
      AND f.Scheduled_Date = DATE_FORMAT(CURDATE(), '%m/%d/%Y') 
      WHERE n.History='NO' 
      AND f.Asset IS NULL 
     ) v 
    ON v.TopLevelAsset_Num = a.TopLevelAsset_Num 
    SET a.Due_Date = DATE_FORMAT(CURDATE(), '%m/%d/%Y') 
+0

Извините, если я не понял! Выборочный запрос дает списки элементов, которые необходимо обновить, и запрос на обновление должен получить результаты Select Query. –

Смежные вопросы