Повторение несколько раз по одной и той же таблице (postgres sql)

#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, Это правильно. Также добавлена эта форма.