SQL Join вопрос - PullRequest
       19

SQL Join вопрос

2 голосов
/ 02 октября 2008

у меня 3 стола

  1. Ссылки
    Идентификатор ссылки
    Имя ссылки
    GroupID (FK в группы)
    SubGroupID (FK в подгруппы)

  2. Группы
    GroupID
    GroupName

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

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

Links.LinkName, Groups.GroupName, SubGroup. SubGroupName

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

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

Ответы [ 10 ]

5 голосов
/ 02 октября 2008

Предполагается, что в каждой группе не более 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)
1 голос
/ 02 октября 2008

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

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
1 голос
/ 02 октября 2008
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
1 голос
/ 02 октября 2008
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

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

Akantro:

У вас будет что-то вроде этого: создать группы таблиц ( целочисленный первичный ключ 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

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

0 голосов
/ 02 октября 2008

Использование 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
0 голосов
/ 02 октября 2008

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

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.

0 голосов
/ 02 октября 2008
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
0 голосов
/ 02 октября 2008
SELECT LinkName, GroupName, SubGroupNamne
FROM Links INNER JOIN Groups ON LInks.GroupID = Groups.GroupID
    LEFT JOIN SubGroup ON Links.SubGroupID = SubGroup.SubGroupID

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

0 голосов
/ 02 октября 2008

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

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 )

Это должно сделать это.

0 голосов
/ 02 октября 2008

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...