Выберите из одной таблицы, где не в другой
Я пытаюсь найти строки, которые находятся в одной таблице, но не другие, обе таблицы находятся в разных базах данных и также имеют разные столбцы в столбце, который я использую для сопоставления.
У меня есть запрос, код ниже, и я думаю, что он, вероятно, работает, но он слишком медленный:
SELECT `pm`.`id`
FROM `R2R`.`partmaster` `pm`
WHERE NOT EXISTS (
SELECT *
FROM `wpsapi4`.`product_details` `pd`
WHERE `pm`.`id` = `pd`.`part_num`
)
Таким образом, запрос пытается сделать следующее:
Выберите все идентификаторы из базы данных R2R.partmaster, которые не находятся в базе данных wpsapi4.product_details. Соответствующие столбцы - partmaster.id и product_details.part_num
Ответы
Ответ 1
Расширяясь на Sjoerd anti-join, вы также можете использовать легко понятный шаблон SELECT WHERE X NOT IN (SELECT)
.
SELECT pm.id FROM r2r.partmaster pm
WHERE pm.id NOT IN (SELECT pd.part_num FROM wpsapi4.product_details pd)
Обратите внимание, что вам нужно использовать `
обратные ссылки на зарезервированные слова, имена с пробелами и т.д., а не с обычными именами столбцов.
В MySQL 5+ этот запрос выполняется довольно быстро.
В MySQL 3/4 это замедляется.
Убедитесь, что у вас есть указатели на соответствующие поля
Вам нужно иметь индекс на pm.id
, pd.part_num
.
Ответ 2
Вы можете ВСПОМОГАТЬ СОЕДИНЕНИЕ двух таблиц. Если во второй таблице нет соответствующей строки, значения будут NULL.
SELECT id FROM partmaster LEFT JOIN product_details ON (...) WHERE product_details.part_num IS NULL
Ответ 3
Таким образом, в Интернете есть множество сообщений, которые показывают, как это сделать, я нашел три способа, как это указывал Йохан и Сьюдерд. Я не мог заставить любой из этих запросов работать, очевидно, что они отлично работают с моей базой данных, которая работает некорректно, и все эти запросы выполнялись медленно.
Итак, я разработал другой способ, которым может помочь кто-то другой:
Основной смысл этого заключается в создании временной таблицы и заполнении ее всей информацией, а затем удалите все строки, которые ARE находятся в другой таблице.
Итак, я выполнил эти 3 запроса, и он быстро запустился (через пару минут).
CREATE TEMPORARY TABLE
`database1`.`newRows`
SELECT
`t1`.`id` AS `columnID`
FROM
`database2`.`table` AS `t1`
.
CREATE INDEX `columnID` ON `database1`.`newRows`(`columnID`)
.
DELETE FROM `database1`.`newRows`
WHERE
EXISTS(
SELECT `columnID` FROM `database1`.`product_details` WHERE `columnID`=`database1`.`newRows`.`columnID`
)
Ответ 4
Чтобы развернуть ответ Johan, если столбец part_num в подвыборке может содержать нулевые значения, запрос прерывается.
Чтобы исправить это, добавьте нулевую проверку...
SELECT pm.id FROM r2r.partmaster pm
WHERE pm.id NOT IN
(SELECT pd.part_num FROM wpsapi4.product_details pd
and pd.part_num is not null)
- Извините, но я не смог добавить комментарий, так как у меня нет репутации!