MySQL: одиночный запрос, отображающий только те строки, в которых id не существует в обеих таблицах - PullRequest
2 голосов
/ 13 декабря 2010

Учитывая следующие две таблицы, как мне написать один запрос, который отображает только строки с id, которого нет в обеих таблицах?

table_one
--------------
id    | name
4     | Jack
5     | John
6     | Henry
8     | Frank
9     | Bob
table_two
--------------
id    | name
4     | Jack
6     | Henry
8     | Frank

Вывод после выполнения запроса: John Bob

Ответы [ 2 ]

2 голосов
/ 13 декабря 2010

при условии, что вы имели в виду «существует в одной или другой таблице, но не в обеих таблицах» - вы используете подзапросы и выбор объединения!

    SELECT name FROM table_one WHERE id NOT IN (SELECT id FROM table_two) 
UNION SELECT name from table_two WHERE id NOT IN (SELECT id FROM table_one);

Кроме того, если вы хотите, чтобы эти результаты были сгруппированыдля вас в одну строку результатов:

SELECT group_concat(x.name) FROM 
  (SELECT name FROM table_one 
      WHERE id NOT IN (SELECT id FROM table_two) 
   UNION SELECT name from table_two 
       WHERE id NOT IN (SELECT id FROM table_one)) as x;
0 голосов
/ 13 декабря 2010

Это было бы просто, если бы MySQL имел оператор FULL OUTER JOIN : такое объединение возвращает строку для каждой записи в каждой таблице, объединенную по идентификатору, если запись существует с обеих сторон, и NULL нанесуществующая сторона, если нет.Затем вы можете сделать одинаковую проверку, которую предлагает @ajreal, с обеих сторон объединения.

Вместо этого вы можете ОБЪЕДИНИТЬ результаты ЛЕВОГО И ПРАВОГО СОЕДИНЕНИЯ ...

SELECT table_one.name
FROM table_one
LEFT JOIN table_two ON table_one.id = table_two.id
WHERE table_two.id IS NULL
UNION
SELECT table_two.name
FROM table_one
RIGHT JOIN table_two ON table_one.id = table_two.id
WHERE table_one.id IS NULL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...