Подтвердить что ты не робот

Выберите из одной таблицы, где не в другой

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

У меня есть запрос, код ниже, и я думаю, что он, вероятно, работает, но он слишком медленный:

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

4b9b3361

Ответ 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)
  • Извините, но я не смог добавить комментарий, так как у меня нет репутации!