Вопрос о соединении SQL

У меня 3 стола

  1. Ссылки
    Ссылка ID
    Название ссылки
    GroupID (FK в группы)
    SubGroupID (FK в подгруппы)

  2. Группы
    Группа ID
    GroupName

  3. Подгруппа
    Подгруппа SubGroupName
    GroupID (FK в группы)

У каждой ссылки должен быть GroupID, но SubGroupID не является обязательным. Как написать запрос SQL, чтобы показать:

Links.LinkName, Groups.GroupName, SubGroup.SubGroupName

Для записей без подгруппы просто введите пустую запись в это поле. Если у меня есть 250 строк ссылок, я должен получить 250 записей из этого запроса.

Есть ли способ сделать это с помощью одного запроса или мне нужно выполнить несколько запросов?

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
2
0
633
10
Перейти к ответу Данный вопрос помечен как решенный

Ответы 10

SELECT 
  links.linkname
  , groups.groupname
  , subgroup.groupname
FROM
  links 
  JOIN groups ON links.groupid = groups.groupid
  LEFT OUTER JOIN subgroups ON links.subgroupid = subgroup.subgroupid

(повторно добавлено для ответа на вопрос OP) кстати, почему бы не хранить группы и подгруппы в одной таблице и не использовать самореферентное соединение?

Акантро:

У вас будет что-то вроде этого: создать группы таблиц ( целочисленный первичный ключ groupid, parentgroupid целочисленный внешний ключ ссылается на группы (groupid), имя группы varchar (50))

тогда ваш запрос будет

SELECT 
  links.linkname
  , groups.groupname
  , SUBGROUPS.groupname
FROM
  links 
  JOIN groups ON links.groupid = groups.groupid
  LEFT OUTER JOIN groups SUBGROUPS ON links.subgroupid = subgroup.groupid

нет никакой функциональной разницы в хранении таких таблиц, но преимущество в том, что вам нужно только перейти в одно место, чтобы редактировать группы / подгруппы

можешь объяснить, как бы ты это сделал?

leora 02.10.2008 18:12
Ответ принят как подходящий

Это предполагает, что в каждой группе есть не более 1 подгруппы. если их больше, то у вас есть возможность получить дополнительные записи.

select links.linkname, groups.groupname, subgroup.subgroupname
from links
  inner join groups on (links.groupid = groups.groupid)
  left outer join subgroup on (links.subgroupid = subgroup.subgroupid)

Я продолжаю получать эту ошибку при использовании вашего SQL: синтаксическая ошибка (отсутствует оператор) в выражении запроса links.groupid = groups.groupid) левая подгруппа внешнего соединения на (links.subgroup = subgroupd.subgroup.id)

leora 02.10.2008 18:53

Похоже, я неправильно написал имя ссылки. Зафиксированный.

NotMe 02.10.2008 19:45

Вы не слишком ясны, но я думаю, вы хотите получить все строки, включая те, у которых нет корреспондента в таблице подгруппы.

Для этого вы можете использовать LEFT JOIN, он будет извлекать NULL, если нет совпадающих строк.

Проди, я могу ошибаться, но я считаю, что вам нужно указать ВНЕШНЕЕ соединение, чтобы получать нули в случае отсутствия соответствующей записи. Вы можете пересмотреть свой ответ.

Onorio Catenacci 02.10.2008 18:13

LEFT JOIN и LEFT OUTER JOIN - это одно и то же.

Amy B 02.10.2008 18:18

SELECT Links.LinkName, Groups.GroupName, SubGroup.SubGroupName -- Will potentially be NULL
FROM Links
INNER JOIN Groups
    ON Group.GroupID = Links.GroupID
LEFT JOIN SubGroup
    ON SubGroup.SubGroupID = Links.SubGroupID

Вы бы использовали внешнее соединение:

select Links.LinkName, Groups.GroupName, SubGroup.SubGroupName
from Links 
inner join Groups on Groups.GroupID = Links.GroupID
left outer join SubGroup on Links.SubGroupID = SubGroup.SubGroupID

Просто используйте LEFT OUTER JOIN в таблице SubGroup, например:

select
    l.LinkName,
    g.GroupName,
    s.SubGroupName
from
    Links l
'
    JOIN Group g
       on ( g.GroupId = l.GroupId)
'
    LEFT OUTER JOIN SubGroup s
       on ( s.SubGroupId = l.SubGroupId )

Это должно сработать.

SELECT LinkName, GroupName, SubGroupNamne
FROM Links INNER JOIN Groups ON LInks.GroupID = Groups.GroupID
    LEFT JOIN SubGroup ON Links.SubGroupID = SubGroup.SubGroupID

Это будет включать строки, у которых нет подгруппы. Этот столбец будет просто NULL.

select L1.LinkName, G1.GroupName, NVL(S1.SubGroupName,' ')
 from Links L1, Groups G1, SubGroup S1 
where L1.GroupID = G1.GroupID and
      L1.GroupID = S1.GroupID

Хорошо, попробуй:

select a.linkname, b.groupname, c.subgroupname
from links a, groups b, subgroup c
where a.groupid = b.groupid
and a.subgroupid = c.subgroupid
and a.subgroupid is not null
union all
select a.linkname, b.groupname, '  '
from links a, groups b
where a.groupid = b.groupid
and a.subgroupid is null

Я думаю, что это должно сработать (это работает в DB2, которая является СУБД, которую я использую чаще всего) - вам нужно отрегулировать пробелы во втором выборе, чтобы они соответствовали размеру subgroup.subgroupname.

Использование LEFT OUTER JOIN в таблице SubGroup предоставит вам все строки из таблицы Links, а там, где существует SubGroup, вернет, что в противном случае вы увидите значение NULL.

SELECT L.LinkName, G.GroupName, S.SubGroupName
 FROM Links As L
  INNER JOIN Groups As G ON L.GroupID=G.GroupID
  LEFT OUTER JOIN SubGroup S ON L.SubGroupID=S.SubGroupID

Это не проверяет, совпадает ли ваш SubGroups.LinkID с Links.LinkID, чего никогда не должно происходить, но если вам нужно это проверить, добавьте в соединение еще одно предложение:

SELECT L.LinkName, G.GroupName, S.SubGroupName
 FROM Links As L
  INNER JOIN Groups As G ON L.GroupID=G.GroupID
  LEFT OUTER JOIN SubGroup S ON L.SubGroupID=S.SubGroupID AND L.GroupID=S.GroupID

Другие вопросы по теме