Что я могу использовать вместо CASE WHEN THEN в MySQL?

#mysql

#mysql

Вопрос:

У меня есть запрос INSERT SELECT с CASE WHEN THEN, но, похоже, его запуск является проблемой. Я получаю:

Код ошибки: 2013. Потерянное соединение с сервером MySQL во время запроса Код ошибки: 1205. Превышен тайм-аут ожидания блокировки; попробуйте перезапустить транзакцию

Что я могу использовать вместо CASE WHEN THEN?

Мне нужно вставить идентификаторы в столбцы degree_type_id , marital_status_id , employment_field_id . Я выбираю из таблиц:

  • new_coders_survey_data,
  • dw_time_dim

Есть ли другой способ вставить идентификационные номера в мою таблицу ФАКТОВ ( dw_coder_fact ) в эти 3 столбца?

У меня есть таблицы:

  • dw_marital_status_dim
  • dw_education_dim
  • dw_employment_field_dim У них есть 2 столбца: 1) идентификатор, 2) описание

С уважением, Анна

 INSERT INTO dw_coder_fact 
        (age, 
         gender, 
         country_citizen, 
         country_live, 
         city_population, 
         is_ethnic_minority, 
         language_at_home, 
         degree_type_id, 
         school_major, 
         marital_status_id, 
         has_children, 
         children_number, 
         employment_status, 
         employment_field_id, 
         is_software_dev, 
         months_programming, 
         is_underemployed, 
         income, 
         survey_date, 
         date_id, 
         attended_bootcamp, 
         bootcamp_fulljob_after, 
         bootcamp_postsalary, 
         hours_learning, 
         bootcamploanyesno, 
         money_for_learning, 
         has_student_debt, 
         student_debt_owe, 
         has_debt, 
         has_home_mortgage, 
         home_mortgage_owe, 
         financially_supporting, 
         has_financially_dependents, 
         job_apply_when, 
         type_of_company_pref, 
         job_role_interest, 
         job_where_pref, 
         expected_earning) 
SELECT s.age, 
       s.gender, 
       s.countrycitizen, 
       s.countrylive, 
       s.citypopulation, 
       s.isethnicminority, 
       s.languageathome, 
       CASE s.schooldegree 
         WHEN "associate's degree" THEN 1 
         WHEN "bachelor's degree" THEN 2 
         WHEN 'high school diploma or equivalent (GED)' THEN 3 
         WHEN "master's degree (non-professional)" THEN 4 
         WHEN 'no high school (secondary school)' THEN 5 
         WHEN 'Ph.D.' THEN 6 
         WHEN 'professional degree (MBA, MD, JD, etc.)' THEN 7 
         WHEN 'some college credit, no degree' THEN 8 
         WHEN 'some high school' THEN 9 
         WHEN 'trade, technical. or vocational training' THEN 10 
         ELSE 11 
       end AS DegreeTypeDescription, 
       s.schoolmajor, 
       CASE s.maritalstatus 
         WHEN 'divorced' THEN 1 
         WHEN 'married or domestic partnership' THEN 2 
         WHEN 'separated' THEN 3 
         WHEN 'single, never married' THEN 4 
         WHEN 'widowed' THEN 5 
         ELSE 6 
       end AS MaritalStatusDescription, 
       s.haschildren, 
       s.childrennumber, 
       s.employmentstatus, 
       CASE s.employmentfield 
         WHEN 'architecture or physical engineering' THEN 1 
         WHEN 'arts, entertainmant, sports, or media' THEN 2 
         WHEN 'constraction and extraction' THEN 3 
         WHEN 'education' THEN 4 
         WHEN 'farming, fishing, and forestry' THEN 5 
         WHEN 'finance' THEN 6 
         WHEN 'food and beverage' THEN 7 
         WHEN 'health care' THEN 8 
         WHEN 'law enforcement and fire and rescue' THEN 9 
         WHEN 'legal' THEN 10 
         WHEN 'office and administrative support' THEN 11 
         WHEN 'sales' THEN 12 
         WHEN 'software development' THEN 13 
         WHEN 'software development and IT' THEN 14 
         WHEN 'transportation' THEN 15 
         ELSE 16 
       end AS EmploymentFieldDescription, 
       s.issoftwaredev, 
       s.monthsprogramming, 
       s.isunderemployed, 
       s.income, 
       s.part1starttime, 
       t.date_id, 
       s.attendedbootcamp, 
       s.bootcampfulljobafter, 
       s.bootcamppostsalary, 
       s.hourslearning, 
       s.bootcamploanyesno, 
       s.moneyforlearning, 
       s.hasstudentdebt, 
       s.studentdebtowe, 
       s.hasdebt, 
       s.hashomemortgage, 
       s.homemortgageowe, 
       s.financiallysupporting, 
       s.hasfinancialdependents, 
       s.jobapplywhen, 
       s.jobpref, 
       s.jobroleinterest, 
       s.jobwherepref, 
       s.expectedearning 
FROM   new_coders_survey_data s, 
       dw_time_dim t; 
  

Комментарии:

1. У вас есть соединение через запятую без условия where — вы намеревались вставить декартово произведение? и из интереса, сколько записей в new_coders_survey_data и dw_time_dim?

2. П.Салмон, что такое соединение запятой? У меня есть пустая таблица, и я пытаюсь вставить в нее значения из 2 других таблиц. Это 33 787 записей в new_coders_survey_data и 33 787 записей в dw_time_dim. Я не знаю, что такое декартово произведение..

3. Затем вам нужно провести небольшое исследование — соединение через запятую сгенерирует 37787 * 37787 строк, что очень много (1427857369) ‘ВНУТРЕННЕЕ СОЕДИНЕНИЕ и , (запятая) семантически эквивалентны при отсутствии условия соединения: оба создают декартово произведение между указанными таблицами (то есть каждая строка в первой таблице присоединяется к каждой строке во второй таблице). dev.mysql.com/doc/refman/8.0/en/join.html ваше соединение через запятую ИЗ new_coders_survey_data s, dw_time_dim t;

4. @Anna Почему у вас две таблицы в FROM предложении? Вы хотите объединить все строки из первой таблицы со всеми строками из второй таблицы? Вероятно, нет; там должен быть предикат join.

5. О, спасибо, теперь я это понимаю. добавлено, ГДЕ s.Part1StartTime = t.survey_date_time limit 1; Я попытался вставить 1 запись, работает отлично. Но 5 строк выдают код ОШИБКИ: 2013. Потерянное соединение с сервером MySQL во время запроса. Я увеличил «интервал ожидания чтения соединения с СУБД» и «innodb_lock_wait_timeout». Ожидание ВСТАВКИ. Большое спасибо!!!!!!!!!!

Ответ №1:

Комментарии @P.Salmon уместны. Какова связь между вашей таблицей [new_coder_survey_data] и вашей таблицей [dw_time_dim] [new_coder_survey_data]? Похоже, что dw_time_dim записывает, когда был проведен опрос для получения данных, которые помещаются в new_coder_survey_data. Если это правильно, должен быть способ идентифицировать предмет опроса в обеих таблицах, обычно и поле id, хотя мы можем предположить, что использование полного имени, среди других альтернатив, также возможно. Если мои предположения верны, вам просто нужно установить внутреннее соединение между обеими таблицами как:

 FROM   new_coders_survey_data s
       INNER JOIN dw_time_dim t
       ON s.id = t.personid
  

или, если вам нужно сослаться на полное имя

 FROM   new_coders_survey_data s
           INNER JOIN dw_time_dim t
           ON s.fullname = t.personname
  

Я не нахожу ни одного поля в вашей таблице dw_coder_fact, которое позволяло бы идентифицировать человека, о котором идет речь (без идентификатора, без имени, без адреса).
В любом случае, присоединение к коме, которое у вас есть, потребует длительного времени обработки и ужасных усилий, чтобы оценить его.

Комментарии:

1. Спасибо. У меня есть общий столбец survey_date_time для объединения. Столбца coder_id здесь нет, так как это AUTO_INCREMENT. Большое спасибо!