2012-09-04 28 views
0

我有兩個表。首先是學生桌,他可以選擇兩門選修課程,其他表格是當前學期的選修課程列表。比較sqlserver中的兩個colums和returing其餘的數據

當學生選擇一門課程時,行插入的基本信息如滾動編號,插入時間,所選課程和狀態爲「1」。當選定的課程被取消時,該行的狀態被設置爲「0」。

假設學生有選擇課程編號1和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是社會。

第二臺擁有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」和第二列我需要獲得「3456789」(剩餘課程)。 如何爲此編寫查詢?

+3

如果發生什麼事,6個月的時間,額外的選修課程中加入(這樣個位數不再足夠了)?你爲什麼要把這些信息打包成一列? –

+0

@Damien_The_Unbeliever:你說得對。但是這是一個演示應用程序,它被要求我們今天在SQL類中解決。 –

+0

@Gaan_setaglA - 那麼,你的狀態可以有兩個值,應該足以能夠解決這個問題。我假設你使用的陳述已經提供給你,所以我不確定你應該從中學到什麼。請注意,從這裏學習**錯誤的東西很容易。這種設計是**不是**在生產環境中使用的東西。 –

回答

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 
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)