#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);
Ответ №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);