2015-10-22 1 views
1

я написал запрос SQL, который возвращает мне перемешиваются данные с помощью NEWID() в SQL Server 2012.Перемешать записи и последовательные записи в SQL сервере

Сценарий: У меня есть таблица, в которой у нас есть вопросы в таблице - «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 

enter image description here

Я хочу, чтобы набор данных, возвращаемый запросом должен также иметь связанный вопрос в нем, но не следует перемешиваются, вместо этого должен быть следующий ряд, чтобы связанный «главный» вопрос.

EDIT

Поскольку эти множества вопросов будет представлена ​​на Интернет-приложение экспертизы, перетасовка вопросов является обязательной.

Один главный вопрос может быть от 0 до многих Связанные вопросы. И связанный вопрос появляется следующая же строка, что соответствующий «Вопрос Main». Как это будет передан в UI, и он будет предоставлять вопросы, основанные на SNO (серийный номер)

Пожалуйста, найдите скриншот (желаемый результат) :

enter image description here

схемы Сценарии:

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

Пожалуйста, измените свой вопрос и предоставить образец данные и желаемые результаты. –

+2

Вот отличное место для начала. http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/ –

+0

@GordonLinoff - обновленный вопрос – Aakash

ответ

3

Если я это правильно понял, вы хотите, связанные вопросы всегда под главным вопросом.Это один из способов сделать это:

select 
    q.id, case when Type = 0 then Question else LinkQuestion end, Solution 
from 
(
    select row_number() over (order by newid()) as ORD, * 
    from tblQuest q 
) q 
outer apply (
    select 0 as Type, 0 as QID, convert(varchar(max), NULL) as LinkQuestion 
    union all 
    select 1, QID, l.LinkQuestion 
    from tblQuestLinked l where q.ID = l.QID 
) x 
order by q.ORD, x.Type, x.QID 

Пример в SQL Fiddle

+0

Я пробовал этот скрипт и отлично работал по мере необходимости. Поскольку эти вопросы будут помещены на экран пользователя для «Экзамена», поэтому перетасовка является обязательной, и она работает. благодаря – Aakash

0

Предположив, что не может быть ny связанный вопрос без корневого вопроса, вы можете просто выбрать все записи из обеих таблиц и приклеить их с помощью UNION ALL. Затем мы хотим, чтобы порядок сортировки основывался на идентификаторе, который у них есть в целом. Но просто упорядочивая qid, newid() будет сортировать по идентификатору, а не случайным образом. Поэтому нам нужна случайная функция, которая принимает идентификатор и дает нам детерминированное «случайное» значение, основанное на нем: 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; 

SQL скрипка: http://sqlfiddle.com/#!3/476fd/2

+1

Я пробовал это в SQL Fiddle, но строки всегда в одном порядке, и просто удача, связанный вопрос ниже вопроса 7: http://sqlfiddle.com/#!3/476fd/1 –

+0

Что связанный вопрос возникает после того, как его вопрос не имеет никакого отношения к удаче здесь. Однако вы правы, что записи всегда поступают в одном порядке. Кажется, что RAND SQL Server немного испорчен. Хотя он принимает целое число как семя, кажется, что он не использует его должным образом; как только цифры очень высокие, вы всегда получаете одинаковое «случайное» число. Не зная, как фактически используется это семенное целое, довольно сложно найти способ заставить его создать случайный порядок. Я буду соответствующим образом обновлять свой ответ, но ответ Джеймса отдает предпочтение. Отличная идея использовать SQL Server OUTER APPLY здесь. –