我编写了一个SQL查询,它使用NEWID()返回一个随机数据 在SQL Server 2012中。
方案: 我有一个表格,我们在表格中有问题 - “tblquest”,而在“tblquestLinked”表中,我们有一个链接问题,与“tblquest”表中的主要问题有关, 现在,下面的查询正确输出了混洗数据。
select ROW_NUMBER() Over (Order by newid()) as sNo,*
from (select q.ID AS [QID], q.Question,
q.Solution,
isnull(q.IsLinked,0) as IsLinked, ql.LinkQuestion
from tblquest q
left join tblQuestLinked ql
on q.ID = ql.QID) a
我希望查询返回的数据集中也应该有一个链接的问题,但不应该被洗牌,而应该是下一行链接“主”问题。
修改
由于这些问题将提交给在线考试申请,因此必须改变问题。
一个主要问题可以包含0到多个链接问题。 并且链接的问题出现在相应的“主要”问题的下一行。 因为这将传递给UI,它将提供基于sNO(序列号)
的问题请找到截图(所需结果):
架构脚本:
CREATE TABLE [dbo].[tblQuest](
[ID] [int] IDENTITY(1,1) NOT NULL,
[IsLinked] [bit] NULL,
[Question] [nvarchar](500) NULL,
[Solution] [nvarchar](500) NULL,
CONSTRAINT [PK_tblQuest] 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]
)
GO
CREATE TABLE [dbo].[tblQuestLinked](
[ID] [int] IDENTITY(1,1) NOT NULL,
[QID] [int] NULL,
[LinkQuestion] [nvarchar](max) NULL,
[CreatedDate] [datetime] NULL,
CONSTRAINT [PK_tblQuestLinked] 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]
)
GO
INSERT [dbo].[tblQuest] ([IsLinked], [Question], [Solution]) VALUES (0, N'Which of ... 1 ', 'Solution 1 ... ')
INSERT [dbo].[tblQuest] ([IsLinked], [Question], [Solution]) VALUES (0, N'Which of ... 2 ', 'Solution 2 ... ')
INSERT [dbo].[tblQuest] ([IsLinked], [Question], [Solution]) VALUES (0, N'Which of ... 3 ', 'Solution 3 ... ')
INSERT [dbo].[tblQuest] ([IsLinked], [Question], [Solution]) VALUES (0, N'Which of ... 4 ', 'Solution 4 ... ')
INSERT [dbo].[tblQuest] ([IsLinked], [Question], [Solution]) VALUES (0, N'Which of ... 5 ', 'Solution 5 ... ')
INSERT [dbo].[tblQuest] ([IsLinked], [Question], [Solution]) VALUES (0, N'Which of ... 6 ', 'Solution 6 ... ')
INSERT [dbo].[tblQuest] ([IsLinked], [Question], [Solution]) VALUES (1, N'Which of ... 7 ', 'Solution 7 ... ')
INSERT [dbo].[tblQuestLinked] ( [QID], [LinkQuestion]) VALUES (7, N'LINKED Q : SUB LINKED')
答案 0 :(得分:3)
答案 1 :(得分:0)
假设没有根问题就没有任何链接问题,您只需从两个表中选择所有记录并将其与UNION ALL
粘合在一起。然后我们首先想要基于它们共有的ID的排序顺序。但只是按qid排序,newid()实际上会按ID排序,而不是随机排序。所以我们需要一个随机函数来获取ID并给我们一个确定性的"随机"基于它的价值:RAND(qid)
。但是,这仍然会在每次执行时给出相同的顺序,因此我们添加了一个随机函数:
<击> 撞击>
ORDER BY rand(rand(convert(int, getdate())) - qid)
它表明SQL Server的RAND
在播种方面有点瑕疵(请参阅我对此的评论)。这对我有用:
ORDER BY rand((datepart(mm, getdate()) * 100000) +
(datepart(ss, getdate()) * 1000) +
datepart(ms, getdate()) ^ qid)
由于两个不同的种子仍然可以导致相同的随机数,我们需要向此添加, qid
,以确保两个链接的条目聚集在一起。此外,我们添加, islinked desc
以便在链接问题之前获得问题。
整个查询:
select qid, question, solution, islinked
from
(
select
id as qid,
question,
solution,
isnull(islinked, 0) as islinked,
id as linkkey
from tblquest
union all
select
id as qid,
linkquestion as question,
null as solution,
0 as islinked,
qid as linkkey
from tblquestlinked
) both
order by rand((datepart(mm, getdate()) * 100000) +
(datepart(ss, getdate()) * 1000) +
datepart(ms, getdate()) ^ qid), qid, islinked desc;