联系:手机/微信(+86 17813235971) QQ(107644445)
标题:通过sql server 数据库中的sql语句实现项目需求
作者:惜分飞©版权所有[未经本人同意,不得以任何形式转载,否则有进一步追究法律责任的权利.]
最近都关注oracle,今天没有办法,因为项目使用的是sql server数据库,许多东西都忘记的差不多了。需要实现一个功能,本来可以使用程序去实现,但是我不爽,一定想通过数据库本身来解决这个问题。问题大概是:
项目中是要实现在别人寻找到宝贝后,要回答一个问题,这个问题暂时定为有四个选项,其中一个正确的,在数据库中使用两张表来实现,一张是记录问题的题目和答案(表一),另一张表专门用来记录每个题目中的选项(表二),表的sql脚本如下:
USE [xb_new] GO /****** 对象: Table [dbo].[Question] 脚本日期: 06/13/2010 21:17:05 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[Question]( [id] [int] IDENTITY(1,1) NOT NULL, [iss_id] [int] NULL, [answer] [nvarchar](50) NULL, [question] [nvarchar](150) NULL, CONSTRAINT [PK_Question_] PRIMARY KEY CLUSTERED ( [id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY]
表中数据如下:
表二:
USE [xb_new] GO /****** 对象: Table [dbo].[Qusetion_Answer] 脚本日期: 06/13/2010 21:18:12 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[Qusetion_Answer]( [id] [int] IDENTITY(1,1) NOT NULL, [qid] [int] NOT NULL, [qtext] [nvarchar](50) NOT NULL, [qvalue] [nvarchar](2) NULL ) ON [PRIMARY]
表中数据如下
现在需求是:把一个题目的四个选项合并到一起,并为了在网页上换行,显示题目,显示答案。
其中难道是行列转换,以前在orcal中都是使用decode来实现的,现在郁闷的sql server中竟然不支持这个函数,只能我在oracle中比较讨厌的case(主要要多写很多when、then、end我不喜欢,而且还容易忘记格 式)来实现。实现sql脚本如下:
SELECT a,q,aa+'<br>'+bb+'<br>'+cc+'<br>'+dd result FROM (SELECT DISTINCT answer a,Question.Question q, aa=MAX(CASE qvalue WHEN 'A' THEN '(A)'+qtext END), bb=max(CASE qvalue WHEN 'B' THEN '(B)'+qtext END), cc=max(CASE qvalue WHEN 'C' THEN '(C)'+qtext END), dd=max(CASE qvalue WHEN 'D' THEN '(D)'+qtext END) FROM dbo.Question,dbo.Qusetion_Answer WHERE qid=dbo.Question.id GROUP BY dbo.Question.answer,Question.Question) temp;
结果如下: