Использование запроса SELECT для SQL таблицы UPDATE - миграция с SQL -Server на MySQL - PullRequest
0 голосов
/ 22 апреля 2020

Я работаю над ОБНОВЛЕНИЕМ из запроса SELECT из текущих данных COVID-19 с сайта NY Times GitHub по номеру https://github.com/nytimes/covid-19-data/archive/master.zip. Это данные CSV с 5 столбцами (дата, округ, штат, FIPS (5-символьный географический идентификатор c, который иногда имеет начальные 0, а также имеет некоторые значения NULL), случаи и случаи смерти). Проблема состоит в том, что случаи и смертность накапливаются. Проблема заключалась в том, чтобы попытаться реорганизовать данные по дате, состоянию и округу, а затем определять количество новых случаев и новых смертей каждый день. Первой мыслью было сделать это с помощью курсора, что заняло навсегда. Здесь хитроумный автор предложил самостоятельно объединить таблицу импорта с добавленным RowID и отменить установку RowID на 1 в предложении WHERE, следовательно:

T1 LEFT OUTER JOIN T2
ON T1.Row_ID - 1 = T2.Row_ID

Следующая задача заключалась в условном вычитании случаи / смерти предыдущего дня за текущий день. Было три случая, чтобы иметь дело с 1. Первая строка объединения, где предыдущий день был НЕДЕЙСТВИТЕЛЕН - это требовало, чтобы значения первой строки были значениями текущего дня. 2. Когда строка предыдущего дня была из другого штата и / или округа, значения текущего дня соответствуют значениям текущего дня (как 1 выше). 3. Если штат и округ были такими же, как и в предыдущий день, было выполнено простое вычитание

CASE
  WHEN T2.Row_ID IS NULL                                    THEN T1.Total_Cases
  WHEN (T1.State <> T2.State) OR (T1.County <> T2.County)   THEN T1.Total_Cases
  ELSE T1.Total_Cases - T2.Total_Cases  
END

В синтаксисе SQL -Server, весь оператор:

UPDATE COVID_19.dbo.US_Counties
SET
  New_Cases = New_Values.New_Cases1,
  New_Deaths = New_Values.New_Deaths1
FROM (
  SELECT
    T1.Row_ID,
    CASE
      WHEN T2.Row_ID IS NULL                                    THEN T1.Total_Cases
      WHEN (T1.State <> T2.State) OR (T1.County <> T2.County)   THEN T1.Total_Cases
      ELSE T1.Total_Cases - T2.Total_Cases
    END AS New_Cases1,
    CASE
      WHEN T2.Row_ID IS NULL                                    THEN T1.Total_Deaths
      WHEN (T1.State <> T2.State) OR (T1.County <> T2.County)   THEN T1.Total_Deaths
      ELSE T1.Total_Deaths - T2.Total_Deaths
    END AS New_Deaths1
  FROM COVID_19.dbo.US_Counties T1
    LEFT OUTER JOIN COVID_19.dbo.US_Counties T2                         
    ON T1.Row_ID - 1 = T2.Row_ID) AS New_Values
WHERE COVID_19.dbo.US_Counties.Row_ID = New_Values.Row_ID;

Это выполнено быстро (1 се c?) На SQL -Сервер с 80000 строк

Я переписал это для MySQL как:

 UPDATE covid_19.us_counties
    SET
      New_Cases = New_Values.New_Cases1,
      New_Deaths = New_Values.New_Deaths1
    FROM (
      SELECT
        T1.Row_ID,
        CASE
          WHEN T2.Row_ID IS NULL                                    THEN T1.Tot_Cases
          WHEN (T1.State <> T2.State) OR (T1.County <> T2.County)   THEN T1.Tot_Cases
          ELSE T1.Tot_Cases - T2.Tot_Cases
        END AS New_Cases1,
        CASE
          WHEN T2.Row_ID IS NULL                                    THEN T1.Tot_Deaths
          WHEN (T1.State <> T2.State) OR (T1.County <> T2.County)   THEN T1.Tot_Deaths
          ELSE T1.Tot_Deaths - T2.Tot_Deaths
        END AS New_Deaths1
      FROM covid_19.us_counties T1
        LEFT JOIN covid_19.us_counties T2                           
        ON T1.Row_ID - 1 = T2.Row_ID) AS New_Values
    WHERE us_counties.Row_ID = New_Values.Row_ID;

К сожалению, это продолжало бросать ошибка непосредственно перед

FROM (

В конце концов, я переписал это без FROM как

UPDATE
    covid_19.us_counties,
    (SELECT
        T1.Row_ID,
        CASE
          WHEN T2.Row_ID IS NULL                                    THEN T1.Total_Cases
          WHEN (T1.State <> T2.State) OR (T1.County <> T2.County)   THEN T1.Total_Cases
          ELSE T1.Total_Cases - T2.Total_Cases
        END AS New_Cases1,
        CASE
          WHEN T2.Row_ID IS NULL                                    THEN T1.Total_Deaths
          WHEN (T1.State <> T2.State) OR (T1.County <> T2.County)   THEN T1.Total_Deaths
          ELSE T1.Total_Deaths - T2.Total_Deaths
        END AS New_Deaths1
      FROM covid_19.us_counties T1
        LEFT JOIN covid_19.us_counties T2                           
        ON T1.Row_ID - 1 = T2.Row_ID) AS New_Values
    SET
      covid_19.us_counties.New_Cases = New_Values.New_Cases1,
      covid_19.us_counties.New_Deaths = New_Values.New_Deaths1
    WHERE covid_19.us_counties.Row_ID = New_Values.Row_ID;

Это на самом деле сработало и выполнено за 4,4 секунды

Похоже, что результаты теперь то же самое для SQL -Server и MySQL. Мой вывод из этого заключается в том, что что-то не «напрямую» переводится, и функция автозаполнения в SQL -Server с более надежной раскраской ключевых слов и волнистыми красными подчеркиваниями и более полными сообщениями об ошибках действительно облегчает кодирование, что редактор в MySQL.

Буду признателен за любые мысли о самом SQL и о лучших инструментах редактирования (IDE?) специально для MySQL.

Заранее спасибо ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...