Синтаксическая ошибка при попытке выполнить сравнение с тем же отношением, сгенерированным естественным соединением - PullRequest
0 голосов
/ 02 июля 2019

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

База данных имеет отношения author и author_number, которые могут быть естественным образом объединены для создания отношения, которое показывает всех авторов, а также все их номера телефонов.

Я пытаюсь написать запрос, который возвращает только кортежи для авторов с одинаковым номером телефона.

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

Вот запрос, который у меня сейчас есть и который, я думал, будет работать:

SELECT A.first_name, A.last_name, A.pNumber
FROM (author NATURAL JOIN author_number AS A), (author NATURAL JOIN author_number AS B)
WHERE A.pNumber = B.pNumber;

Запрос даетошибка:

ERROR 1066 (42000) at line 60 in file: 'QueryLib.sql': Not unique table/alias: 'author'

Кроме того, мой исходный запрос не содержал A.first_name, etc. в предложении SELECT, он просто имел first_name, etc., но яполучил то же сообщение об ошибке.

1 Ответ

2 голосов
/ 02 июля 2019

Первое замечание, что естественные объединения считаются вредными: Считается ли ЕСТЕСТВЕННОЕ (СОЕДИНЕНИЕ) вредным в производственной среде? . Лучше написать явное внутреннее соединение.

Возвращаясь к вашему вопросу. Вам нужно ссылаться на отдельные таблицы из естественного объединения. Например:

SELECT
  A1.first_name, A1.last_name, AN1.phone_number
FROM
  Author A1 NATURAL JOIN AuthorNumber AN1,
  Author A2 NATURAL JOIN AuthorNumber AN2
WHERE
  AN1.phone_number = AN2.phone_number AND
  NOT (A1.first_name = A2.first_name AND A1.last_name = A2.last_name);

Демо : http://sqlfiddle.com/#!9/ba2951/7.

...