Справка SQL: оператор Select объединяет отношение один ко многим - PullRequest
1 голос
/ 15 декабря 2008

Например, у меня есть две таблицы. Первая таблица - это студенты, а вторая - курсы, которые изучает студент. Как я могу использовать оператор выбора, чтобы видеть две колонки «Студент» и «Курсы», чтобы курсы разделялись запятыми.

Спасибо.

Ответы [ 8 ]

10 голосов
/ 15 декабря 2008

Если вы используете SQL Server 2005:

Это должно сделать то, что вы ищете - замените поля, как вам нужно:

В демонстрационных целях рассмотрим следующие две структуры таблицы:

Students(
  STU_PKEY Int Identity(1,1) Constraint PK_Students_StuPKey Primary Key,
  STU_NAME nvarchar(64)
)

Courses(
  CRS_PKEY Int Identity(1, 1) Constraint PK_Courses_CrsPKey Primary Key,
  STU_KEY Int Constraint FK_Students_StuPKey Foreign Key References Students(STU_PKEY),
  CRS_NAME nvarchar(64)
)

Теперь этот запрос должен выполнить работу, которую вы ищете:

Select  s.STU_PKEY, s.STU_NAME As Student,
        Stuff((
            Select  ',' + c.CRS_NAME
            From    Courses c
            Where   s.STU_PKEY = c.STU_KEY
            For     XML Path('')
        ), 1, 1, '') As Courses 
From    Students s
Group By s.STU_PKEY, s.STU_NAME

Намного проще, чем принятый в настоящее время ответ ...

1 голос
/ 19 апреля 2011
create table Project (ProjectId int, Description varchar(50));
insert into Project values (1, 'Chase tail, change directions');
insert into Project values (2, 'ping-pong ball in clothes dryer');

create table ProjectResource (ProjectId int, ResourceId int, Name varchar(15));
insert into ProjectResource values (1, 1, 'Adam');
insert into ProjectResource values (1, 2, 'Kerry');
insert into ProjectResource values (1, 3, 'Tom');
insert into ProjectResource values (2, 4, 'David');
insert into ProjectResource values (2, 5, 'Jeff');

SELECT *, 
  (SELECT Name + ' ' AS [text()] 
   FROM ProjectResource pr 
   WHERE pr.ProjectId = p.ProjectId 
   FOR XML PATH ('')) 
AS ResourceList 
FROM Project p

--    ProjectId    Description                        ResourceList
--    1            Chase tail, change directions      Adam Kerry Tom 
--    2            ping-pong ball in clothes dryer    David Jeff 
0 голосов
/ 15 декабря 2008

Вы используете 2005 или 2008? Если так, то ищите команду PIVOT. Это должно быть более эффективно, чем функция с курсором.

0 голосов
/ 15 декабря 2008

Вы можете использовать UDF, который просматривает связанные записи и объединяет возвращаемую строку вместе, но это будет дорого - если вы попробуете, убедитесь, что ваш курсор READ_ONLY FAST_FORWARD

0 голосов
/ 15 декабря 2008

Итак, вы хотите увидеть:

'Jade', 'Math, English, History'
'Kieveli', 'History, Biology, Physics'

Да, разделение запятыми всегда желательно, но SQL не очень хорош в этом. Вот подход, который я всегда планировал использовать:

Создайте функцию на сервере SQL, которая использует курсор для циклического обхода подзапроса (извините - я не полностью протестировал это):

CREATE FUNCTION commacourselist(@studentname varchar(100))
RETURNS @List varchar(4096)
AS
BEGIN

DECLARE @coursename varchar(100)

DECLARE FOR
SELECT course.name FROM course WHERE course.studentname = @studentname
OPEN coursecursor

FETCH NEXT FROM coursecursor INTO @coursename 
WHILE @@FETCH_STATUS = 0
BEGIN
 IF @List = ''
 BEGIN
  SET @List = @coursename
 END
 ELSE
 BEGIN
  SET @List = @List + ',' + @coursename 
 END
 FETCH NEXT FROM coursecursor INTO @coursename 
END
CLOSE coursecursor 
DEALLOCATE coursecursor 

RETURN
END
GO

Затем вызовите функцию в запросе:

SELECT student.name, 
       commacourselist( student.name )  
FROM student
0 голосов
/ 15 декабря 2008

Я думаю, что эта страница MySQL поможет вам в этом. http://dev.mysql.com/doc/refman/4.1/en/group-by-modifiers.html

0 голосов
/ 15 декабря 2008

Как правило, вы говорите об объединении:

SELECT 
    S.*,
    SC.*
  FROM
    Students S
    INNER JOIN Student_Courses SC
      ON S.student_id = SC.student_id

Тем не менее, это даст вам один ряд на курс . SQL не позволяет легко получить набор курсов в виде списка через запятую в одной строке (это не операция на основе набора). В зависимости от поставщика, существуют разные способы сделать это, включая зацикливание.

0 голосов
/ 15 декабря 2008

Это зависит от того, какой сервер вы используете. SQL Server? MySQL? Другое

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