2016-12-22 2 views
0

У меня есть таблица под названием «email» с 2 столбцами «von» и «zu». Оба содержат варчар (20). Мне нужно получить таблицу, содержащую каждую строку, которая соответствует определенному имени. Например: эл.адрес:SQL-псевдонимы таблицы

von |  zu 
--------------- 
Finn | John 
Finn | Lisa 
Eric | Finn 
Eric | Lisa 

Теперь мне нужно получить каждый соответствующий имя «Финна». Результат должен выглядеть следующим образом:

X 
------- 
John 
Lisa 
Eric 

Мой код выглядит следующим образом:

Select X from 
(Select von as X from email where von = 'Finn'), 
(Select zu as X from email where zu = 'Finn'); 

И я получаю следующее сообщение об ошибке:

#1248 - Every derived table must have its own alias 

Может кто-нибудь помочь мне и сказать мне, что я сделал не так? Приветствия, Финн

+0

Почему вы не используете UNION вместо запятой. –

+0

То, что вы сделали неправильно, заключается в том, что подзапросы должны иметь свое имя, поэтому после того, как) поместите что-то вроде 'von' и' zu' Это необходимо, так как система не сможет ссылаться на поле X, не зная таблицы, и вы не можете ссылаться на встроенный просмотр без псевдонима. Даже если вы назвали столбцы по-разному, я думаю, что было бы разумно использовать псевдонимы. – xQbert

ответ

0

Это не ответ, но уточнение, что делает ваш собственный запрос.


Select X from 
(Select von as X from email where von = 'Finn') von_finn, 
(Select zu as X from email where zu = 'Finn') zu_finn; 

(я добавил недостающие таблицы псевдонимов.)

Вы используете старый присоединиться sytax здесь, который был использован в 1980-х годах. В настоящее время мы указываем, какой тип соединения мы используем. В вашем случае, если там нет присоединиться к критериям на столах, что бы перекрестное соединение:

Select X 
from (Select von as X from email where von = 'Finn') von_finn 
cross join (Select zu as X from email where zu = 'Finn') zu_finn; 

Давайте посмотрим на первый вложенный запрос. Вы выбираете von, где von - это «Финн». Это, безусловно, опечатка, и вы действительно хотели выбрать zu. Верный? Это даст вам людей, получивших электронное письмо от Финна. То же самое для второго подзапроса, где вы получите всех людей, которые отправили электронное письмо Финну. Крест-соединение: возьмите всех отправителей и объедините их со всеми получателями (т. Е. Получите все комбинации). С вашими данными выборки вы получите:

 
zu_finn.x | von_finn.x 
----------+----------- 
Eric  | John 
Eric  | Lisa 

Тогда вы покажете x. Но какой? zu_finn.x или von_finn.x? Либо СУБД выдает ошибку неоднозначности (что было бы предпочтительнее), либо тихо решило бы для одного столбца, поэтому вы либо показывали бы Eric, Eric, либо John, Lisa.

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

+0

Большое спасибо :) Ха-ха, я должен был изучить его в школе. SQL не является моей любимой темой. Я понимаю, что ты имеешь в виду. Очень полезно! :) –

+0

И да. Это была опечатка :) –

1

Использование Союза. Это должно работать так, как вы хотите.

Select von as X from email where von = 'Finn' 
UNION ALL 
Select zu as X from email where zu = 'Finn'; 
+0

Имейте в виду, что дублирующиеся строки удаляются из результата при использовании 'UNION', который может и не быть тем, что этот пользователь ищет. – Aleks

+0

Хорошая точка. Изменено на «Союз ALL». Спасибо! –

+0

Это прекрасно! Спасибо :) дублированные строки должны быть удалены.Это для социальной сети, которая находит ваши контакты. :) –

Смежные вопросы