#sql #postgresql
Вопрос:
я работаю с sql с нескольких дней как новичок и застрял на проблеме!
Проблема:
- Задана таблица
user_email_table
, столбцы которой являются (идентификатор, идентификатор пользователя, идентификатор пользователя, почта) - Как сделать так, чтобы все пользователи были связаны друг с другом, чтобы каждый пользователь расширял себя
user_email_table
id | user_id | email_id 1 | 1 | xyz 2 | 2 | xyz2 3 | 3 | xyz3 4 | 4 | xyz4
Желаемый Результат
id | user_id_1 | user_id_2 | user_id_1_email | user_id_2_email | ----------------------------- 1 | 1 | 2 | xyz|xyz2| 1 | 1 | 3 |xyz|xyz3| 1 | 1 | 4 |xyz|xyz4| 1 | 2 | 1 |xyz2|xyz1| 1 | 2 | 3 |xyz2|xyz3| 1 | 2 | 4 |xyz2|xyz4| 1 | 3 | 1 |xyz3|xyz1| 1 | 3 | 2 |xyz3|xyz2| 1 | 3 | 4 |xyz3|xyz4| 1 | 4 | 1 |xy4|xyz1| 1 | 4 | 2 |xyz4|xyz2| 1 | 4 | 3 |xyz4|xyz3|
Пожалуйста, игнорируйте данные проверки полей электронной почты, это просто для напоминания, чтобы упомянуть эти столбцы в выходной таблице
Какой SQL-запрос может привести к этой таблице
Комментарии:
1. Сделайте самостоятельное присоединение.
2. @jarlh Не отвечайте в комментариях.
3. @LioElbammalf, это не ответ, это намек!
4. @jarlh Технически, вы также не должны «намекать» в комментариях, как бы заманчиво это ни было; они предназначены для разъяснения вопроса . Если вы считаете, что на этот вопрос не стоит отвечать, проголосуйте за закрытие; если вы считаете, что на него стоит ответить, либо сделайте это, либо подождите, пока это сделает кто-то другой.
5. Иногда кому-то просто нужна подсказка, чтобы найти решение. Запрос, написанный человеком, у которого возникла проблема,-это то, что будет запомнено, а не то, что просто скопировано и вставлено.
Ответ №1:
Вам нужно «перекрестное соединение» таблицы с самой собой, исключая самоподчиненные строки. Вы можете сделать:
select 1 as id, a.user_id as user_id_1, b.user_id as user_id_2, a.email_id as user_id_1_email, b.email_id as user_id_2_email from user_email_table a cross join user_email_table b where a.user_id lt;gt; b.user_id
Редактировать:
Как указывает @IMSoP, запрос также может использовать общее соединение с предикатом объединения и может быть перефразирован как:
select 1 as id, a.user_id as user_id_1, b.user_id as user_id_2, a.email_id as user_id_1_email, b.email_id as user_id_2_email from user_email_table a join user_email_table b on a.user_id lt;gt; b.user_id
Комментарии:
1. Поскольку у вас есть условие, связывающее их, я думаю, что это также может быть записано как внутреннее соединение (с
where
предложением в качествеon
предложения). Честно говоря, я не уверен, что яснее.2. @IMSoP, Это правильно. Также добавлена эта форма.