Как выполнить операцию соединения (join) одной и той же таблицы с самой собой в SQL?

Какую SQL-запросную структуру следует использовать, чтобы в одной и той же таблице GD_Citizen_ClassifierBase вывести вопрос (Name) и название тематики (Topic), заменяя id тематики на его имя?
Изображение к вопросу
  • 1 декабря 2023 г. 3:39
Ответы на вопрос 3
Вам сначала нужно сделать соединение таблицы самой с собой. В этом случае вы должны использовать псевдонимы таблицы, чтобы SQL смог отличать одну копию таблицы от другой.

Предполагая, что в ваших данных `Name` это имя вопроса, `id` - это идентификатор вопроса, и у вас есть колонка `Topic_ID`, которая связывает вопрос с темой. Также предположим, что у каждой темы есть уникальный идентификатор `id` и связанное название `Topic`, которые оба хранятся в одной и той же таблице GD_Citizen_ClassifierBase.

В этом случае запрос может быть таким:

```sql
SELECT t1.Name AS Question, t2.Name AS Topic
FROM GD_Citizen_ClassifierBase t1
INNER JOIN GD_Citizen_ClassifierBase t2 ON t1.Topic_ID = t2.id
;
```

Здесь `t1` и `t2` это псевдонимы для той же таблицы GD_Citizen_ClassifierBase. Использование соединения позволяет нам связать вопросы в `t1` с темами в `t2` посредством `Topic_ID` и `id`. 

Однако, это подразумевает, что у вас есть столбец `Topic_ID` в вашей таблице, который связывает вопросы с темами. Если у вас нет такого столбца,  вам придется решить, как вы хотите связывать вопросы с темами.
Возможно, стоит добавить дополнительный атрибут для различия между записями. Пример такого запроса: выбрать все из table_1 (темы), затем все из table_1 (вопросы), соединить по теме и id. У вас не должно быть значений тем в t1, и имя должно начинаться с 'Тематика%'. Действительно будет удобно иметь атрибут типа для различия между разделами и тематикой. 
 
Немного не хватает контекста при написании запроса к базе данных. Ты хочешь выбрать оба набора данных: t1 (представляемое как темы) и t2 (вопросы), основываясь на их сопоставлении через поле тема. Но, важно заметить, что в t1 не должно быть значений темы и имя должно быть подобно формату "Тематика%". Очевидно, что запрос будет работать эффективнее, если был бы атрибут типа, чтобы отличать раздел от темы.
Похожие вопросы