Вставка значений в таблицу на основе значений из представления и другой таблицы

#mysql #sql

#mysql #sql

Вопрос:

У меня есть 2 таблицы и представление с этой структурой (все столбцы являются строками):

 first_table -> 1 column
second_table -> 3 columns
view -> 1 column
  

Во всех них у меня есть столбец с именем system.В первой таблице нет новейших систем, как в представлении.
Итак, что я пытаюсь сделать, это вставить в first_table все системы из представления, которые еще не вставлены
в таблицу, а также игнорировать те, которые находятся во второй таблице.

Пример :

 Fist Table :     View:         Second table:

System 1         System 1      System 2 
                 System 2      System 3
                 System 3
                 System 4
                 System 5 
  

Я хочу, чтобы first_table выглядел так :

 System 1
System 4
System 5 
  

До сих пор я пробовал что-то вроде этого :

 INSERT ignore INTO first_table
SELECT SYSTEM
  FROM view
where System !="" GROUP BY System
  

и еще :

 INSERT ignore INTO first_table
    SELECT System
        FROM view
        WHERE System !="" GROUP BY System  and  NOT EXISTS (SELECT System
                              FROM view)
  

Ответ №1:

Вы были на правильном пути, используя NOT EXISTS . Но вы должны сопоставить подзапрос (для какой системы не должно существовать строки?) И использовать два из них, по одному для каждой таблицы.

 INSERT INTO `first table`
            (system)
            SELECT v.system
                   FROM `view` v
                   WHERE NOT EXISTS (SELECT *
                                            FROM `first table` t1
                                            WHERE t1.system = v.system)
                         AND NOT EXISTS (SELECT *
                                                FROM `second table` t2
                                                WHERE t2.system = v.system);
  

db<>скрипка

Ответ №2:

Вы можете попробовать это на этой скрипке SQL

 SELECT TFinal.S 
FROM (
 SELECT S FROM T3 WHERE S NOT IN (SELECT S FROM T2) 
) AS TFinal
WHERE TFinal.S NOT IN (SELECT S FROM T1); 
  

Ответ №3:

Попробуйте что-то вроде приведенного ниже. Идея состоит в том, чтобы выполнить объединение на T2 и T1 и минус на T3. Пожалуйста, обратите внимание, что это только для справки. Переписать по мере необходимости:

 INSERT INTO T1  select S from T3 where T3.S NOT IN (SELECT S from T2 UNION select S from T1);