2015-11-03 1 views
0

У меня есть две таблицы (это только упрощенные версии):SQL-запрос - сделать условия условными?

`Locations`: 
id city country area 
-- ---- ------- ---- 
71 C  X  E    
72 C  B  E    
73 C  F  G    
74 L  X  E 
75 M  N  O 
76 M  N  E   

`Findings`: 
ID city country area resultVM 
-- ---- ------- ---- -------- 
18      empty 
19 C     lam 
20  X    lam8  
21     E  pdg4 

Теперь я хочу написать вставку, которая заполняет третью таблицу, в соответствии с данными в этих двух. Он должен содержать все идентификаторы из таблицы местоположения один раз (Summed.locations_id - это ссылка на Locations.id, очевидно) и сопоставленный результатVM из таблицы «Выводы». Результат должен быть:

`Summed`: 
locations_id resultVM 
------------ -------- 
71    lam   
72    lam   
73    lam   
74    lam8 
75    empty 
76    pdg4 

Критерии: попробуйте сначала соответствие город, чтобы найти resultVM в таблице выводах, если нет результата, то не в той же стране, то область, и, наконец, если нет результатов в любом случае - пустая строка, в которой не заполняется ни один город/страна/область.

В настоящее время я делаю это с 4 вставками/обновлениями дубликатов ключей, но так как таблицы очень большие, что занимает много времени. Кто-нибудь знает, может ли это быть сделано в одном обновлении/вставке/что-нибудь (в MySQL)? Спасибо!

ответ

0

Вы можете сделать левый присоединиться.

INSERT INTO Summed (locations_id,resultVM) 
    SELECT Locations.`id` AS locations_id,(CASE WHEN Findings_city.`city` IS NOT NULL THEN Findings_city.`resultVM` 
          WHEN Findings_country.`country` IS NOT NULL THEN Findings_country.`resultVM` 
          WHEN Findings_area.`area` IS NOT NULL THEN Findings_area.`resultVM` 
          ELSE 'empty'END) AS resultVM 
    FROM 
    Locations 
    LEFT JOIN Findings Findings_city ON Locations.`city` = Findings_city.`city` 
    LEFT JOIN Findings Findings_country ON Locations.`country` = Findings_country.`country` 
    LEFT JOIN Findings Findings_area ON Locations.`area` = Findings_area.`area` 
    GROUP BY Locations.`id` 

Вот SQL Fiddle Demo Надеюсь, что это помогает ..

+0

Также работает очень хорошо, и в то время как я буду использовать @ wchiquito (немного более высокая производительность), вы ответили сначала так, ответ твой. Большое спасибо за Вашу помощь! :) – empir07

+0

yup вместо 'case when' use' COALESCE' –

1

Try:

INSERT INTO `Summed` 
SELECT 
    `l`.`id`, 
    COALESCE(
    `fcity`.`resultVM`, 
    `fcountry`.`resultVM`, 
    `farea`.`resultVM`, 
    `fempty`.`resultVM`) 
FROM 
    `Locations` `l` 
    LEFT JOIN `Findings` `fcity` ON `l`.`city` = `fcity`.`city` 
    LEFT JOIN `Findings` `fcountry` ON `l`.`country` = `fcountry`.`country` 
    LEFT JOIN `Findings` `farea` ON `l`.`area` = `farea`.`area` 
    LEFT JOIN `Findings` `fempty` ON `fempty`.`city` = '' AND 
         `fempty`.`country` = '' AND 
         `fempty`.`area` = ''; 

SQL Fiddle demo

+0

Вау, я даже не думал о том, чтобы лежать в таблице несколько раз ... Хорошо работает, а производительность также намного лучше, чем у моего предыдущего метода. Большое спасибо! :) – empir07

+0

@ empir07: Вы можете улучшить производительность (битбит), см. [SQL Fiddle] (http://sqlfiddle.com/#!9/90966/1). – wchiquito

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

  • Нет связанных вопросов^_^