0

2つのテーブルがあります。最初の1つは、2つのオプションのコースを選択できる学生テーブルで、もう1つは、現在の学期のオプションのコースリストです。

学生がコースを選択するたびに、ロール番号、挿入された時間、選択されたコース、ステータスなどの基本的な詳細が「1」として行が挿入されます。選択したコースの選択を解除すると、その行のステータスが「0」に設定されます。

学生がコースID1と2を選択したとします。

このクエリを使用しています

select SselectedCourse AS [text()] FROM  Sample.dbo.Tbl_student_details where var_rollnumber = '020803009' and status = 1 order by var_courseselectedtime desc FOR XML PATH('')

これにより、結果は「12」になります。ここで、1は物理学、2は社会的です。

2番目のテーブルは、1〜9の値を保持します。たとえば、コースID

1 = physics
2 = social
3 = chemistry
4 = geography
5 = computer
6 = Spoken Hindi
7 = Spoken English
8 = B.EEE
9 = B.ECE

現在の学生は1と2を選択しています。したがって、最初の列で「12」を取得し、2番目の列で「3456789」(残りのコース)を取得する必要があります。これに対するクエリを書く方法は?

4

2 に答える 2

2

これは単一のクエリではありませんが、単純です。


DECLARE @STUDENT AS TABLE(ID INT, COURSEID INT)
DECLARE @SEM AS TABLE (COURSEID INT, COURSE VARCHAR(100))

INSERT INTO @STUDENT VALUES(1, 1)

INSERT INTO @STUDENT VALUES(1, 2)

INSERT INTO @SEM VALUES(1, 'physics')

INSERT INTO @SEM VALUES(2, 'social')

INSERT INTO @SEM VALUES(3, 'chemistry')

INSERT INTO @SEM VALUES(4, 'geography')

INSERT INTO @SEM VALUES(5, 'computer')

INSERT INTO @SEM VALUES(6, 'Spoken Hindi')

INSERT INTO @SEM VALUES(7, 'Spoken English')

INSERT INTO @SEM VALUES(8, 'B.EEE')

INSERT INTO @SEM VALUES(9, 'B.ECE')

DECLARE @COURSEIDS_STUDENT VARCHAR(100), @COURSEIDS_SEM  VARCHAR(100)

SELECT @COURSEIDS_STUDENT = COALESCE(@COURSEIDS_STUDENT, '') + CONVERT(VARCHAR(10), COURSEID) + ' ' FROM @STUDENT

SELECT @COURSEIDS_SEM = COALESCE(@COURSEIDS_SEM , '') + CONVERT(VARCHAR(10), COURSEID) + ' ' FROM @SEM WHERE COURSEID NOT IN (SELECT COURSEID FROM @STUDENT)


SELECT @COURSEIDS_STUDENT COURSEIDS_STUDENT, @COURSEIDS_SEM COURSEIDS_SEM
于 2012-09-04T12:42:55.100 に答える
1

これを試して:

;WITH CTE as (select ROW_NUMBER() over (order by (select 0)) as rn,* from Sample.dbo.Tbl_student_details)

,CTE1 As(
select rn,SselectedCourse ,replace(stuff((select ''+courseid  from course_details for xml path('')),1,1,''),SselectedCourse,'') as rem from CTE a 
where rn = 1
union all
select c2.rn,c2.SselectedCourse,replace(rem,c2.SselectedCourse,'') as rem 
from CTE1 c1 inner join CTE c2
on c2.rn=c1.rn+1

)

select STUFF((select ''+SselectedCourse from CTE1 for xml path('')),1,0,''),(select top 1 rem from CTE1 order by rn desc)
于 2012-09-04T07:09:59.137 に答える