たとえば、2 つのテーブルがあります。最初のテーブルは学生で、2 番目のテーブルは学生が受講しているコースです。select ステートメントを使用して、学生とコースの 2 つの列を表示し、コースがコンマで区切られるようにするにはどうすればよいですか。
ありがとう。
たとえば、2 つのテーブルがあります。最初のテーブルは学生で、2 番目のテーブルは学生が受講しているコースです。select ステートメントを使用して、学生とコースの 2 つの列を表示し、コースがコンマで区切られるようにするにはどうすればよいですか。
ありがとう。
SQL Server 2005 を使用していると仮定します。
これはあなたが望んでいることをするはずです-明らかに必要に応じてフィールドを置き換えてください:
デモ用に、次の 2 つのテーブル構造を検討してください。
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
現在受け入れられている回答よりもはるかに簡単です...
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
一般的に、あなたが話しているのは結合です:
SELECT
S.*,
SC.*
FROM
Students S
INNER JOIN Student_Courses SC
ON S.student_id = SC.student_id
ただし、これはcourseごとに 1 つの行を提供します。SQL では、一連のコースをカンマ区切りのリストとして 1 行で取得することは簡単ではありません (これはセットベースの操作ではありません)。ベンダーによっては、ループを含むさまざまな方法があります。
この MySQL ページがその手助けになると思います。 http://dev.mysql.com/doc/refman/4.1/en/group-by-modifiers.html
だからあなたは見たい:
'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
関連するレコードをカーソルで移動し、戻り文字列を連結する UDF を使用できますが、これにはコストがかかります。試してみる場合は、カーソルが READ_ONLY FAST_FORWARD であることを確認してください。
2005 または 2008 を使用していますか? その場合は、PIVOT コマンドを検索します。カーソルのある関数よりも効率的です。
使用しているサーバーによって異なります。SQLサーバー?MySQL? 他の?