Обновления и самостоятельные объединения и заявления о делах - о боже - PullRequest
0 голосов
/ 27 сентября 2018

Я думаю, что, возможно, пытаюсь сделать слишком много одним запросом, и это сводит меня с ума.

У меня есть две таблицы: Source и Zip_Code.Исходная таблица имеет поле почтового индекса, которое может состоять из 3 или 5 цифр.

Если это 3 цифры, мне нужно присоединиться к 3-значному полю таблицы zip_code и установить в поле source_zip Source соответствующую 5-значную запись таблицы zip_code.

Если это 5 цифр, мне нужно связать 5-значное поле таблицы zip_code (чтобы убедиться, что это действительный почтовый индекс), а затем поместить это 5-значное число в поле источника new_zip.

Я уже понимаю, что вы не можете манипулировать чем-то, что обновляете, поэтому используете самообъединение для манипулирования копией.Теперь мне нужно создать Source2 и объединить таблицы Source1, Source2 и Zip_Code.

UPDATE SOURCE1
INNER JOIN SOURCE2 ON SOURCE1_UID = SOURCE2_UID
INNER JOIN ZIP_CODE ON SOURCE1_ZIP =
   (   
    SELECT
      (
       CASE WHEN LENGTH(SOURCE1.ZIP <4
       THEN ZIP_CODE.3_DIGIT
       ELSE ZIP_CODE.5_DIGIT
       END
       )
    FROM SOURCE2
    ) 

SET SOURCE1.NEW_ZIP = 
 (
  CASE WHEN LENGTH(SOURCE1.ZIP <4
  THEN ZIP_CODE.3_DIGIT
  ELSE ZIP_CODE.5_DIGIT
  END
  )

Я знаю, что делаю что-то не так, но у меня есть блок относительно того, где.

1 Ответ

0 голосов
/ 27 сентября 2018

Вы не называете таблицу Source в запросе.Вам нужно назвать таблицу и затем дать ей псевдоним, например Source1, если вам нужно сослаться на нее дважды.

Но я не думаю, что есть необходимость в самостоятельном объединении.

Нет необходимости в подзапросах, вы можете использовать условные выражения в предложении ON.

UPDATE Source AS s
JOIN Zip_Code AS z ON 
    CASE WHEN LENGTH(s.zip) = 3
        THEN z.3_digit
        ELSE z.5_digit
    END
SET s.new_zip = z.5_digit

В вашем описании говорится, что вы всегда хотите установить new_zip для 5-значного кода, поэтому естьCASE в предложении SET не требуется.

...