Не удается запросить имена из таблицы, которая не существует в другой таблице - PullRequest
0 голосов
/ 27 сентября 2018

У меня есть две таблицы, которые идентичны по полям.Я хочу запросить имена в table2, которых нет в table1.Обе таблицы имеют уникальное поле name (первичный ключ).

Вот информация.моего дизайна базы данных: Мой запрос:

SELECT `table2`.`name` FROM `mydatabase`.`table2`, `mydatabase`.`table1` 
WHERE `table2`.`name` NOT IN (SELECT  `table1`.`name` FROM `mydatabase`.`table1`)
AND table2`.`name` NOT LIKE 'xyz%';

Вывод SHOW CREATE TABLE <table name>:

Для table1:

table1, CREATE TABLE `table1` (
  `name` varchar(500) NOT NULL,
  `ip` varchar(500) DEFAULT NULL,
  `type` varchar(500) DEFAULT NULL,
  `grade` varchar(500) DEFAULT NULL,
  `extended_ip` text,
  PRIMARY KEY (`name`),
  UNIQUE KEY `mydatabase_name_UNIQUE` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1

И table2:

tabl2, CREATE TABLE `table2` (
  `name` varchar(500) NOT NULL,
  `ip` varchar(500) DEFAULT NULL,
  `type` varchar(500) DEFAULT NULL,
  `grade` varchar(500) DEFAULT NULL,
  `extended_ip` text,
  PRIMARY KEY (`name`),
  UNIQUE KEY `mydatabase_name_UNIQUE` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1

The output of EXPLAIN <my query>:

# id, select_type, table, partitions, type, possible_keys, key, key_len, ref, rows, filtered, Extra
1, PRIMARY, table1, , index, , mydatabase_name_UNIQUE, 502, , 17584, 100.00, Using index
1, PRIMARY, table2, , index, , mydatabase_name_UNIQUE, 502, , 46264, 100.00, Using where; Using index; Using join buffer (Block Nested Loop)
2, SUBQUERY, table1 , index, PRIMARY,mydatabase_name_UNIQUE, mydatabase_name_UNIQUE, 502, , 17584, 100.00, Using index

РЕДАКТИРОВАТЬ: И я забыл упомянуть, что происходит, что база данных просто падает с моим запросом.Я использую mysql-workbench в Ubuntu 18.Когда я выполняю этот запрос, вся рабочая среда закрывается, и мне приходится перезапускать, открывая ее снова.

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

Просто выполните LEFT JOIN на name, с table2 в качестве стартовой таблицы, поскольку вы хотите рассмотреть все имена из table2, которые не существуютв table1.Имена, которые не существуют в table1, будут иметь значение null после объединения.Обратите внимание, что это решение на основе объединения будет значительно быстрее, чем любой подход на основе подзапроса.

Кроме того, следует избегать неявных объединений на основе запятых (,) .Это старый синтаксис, и вы должны использовать явный синтаксис JOIN.Читайте: Явные против неявных объединений SQL

Кроме того, полезно использовать Псевдонимы для лучшей читаемости

Попробуйте выполнить следующее:

SELECT t2.name 
FROM `mydatabase`.`table2` AS t2
LEFT JOIN `mydatabase`.`table1` AS t1 ON t1.name = t2.name 
WHERE t1.name IS NULL 
  AND t2.name NOT LIKE 'xyz%';
0 голосов
/ 27 сентября 2018

Попробуйте подзапрос:

SELECT `table2`.`name` FROM `mydatabase`.`table2` WHERE `table2`.`name` NOT IN (SELECT `table1`.`name` FROM `mydatabase`.`table1`);
...