2010-05-11 3 views
2

У меня есть базовая таблица участников и ответов, со следующей структурой:проблемы SQL-запрос: Как объединить два список

ParticipantId, BusUnitId, QuestionNum, Answer.

В этой таблице QuestionNum диапазонов, скажем, от 1 до 6. У меня также есть две другие таблицы, которые относятся к ссылке QuestionNum в фактическую таблицу вопросов, BusUnitQuestions и ParticipantQuestions. Для каждого QuestionNum я должен получить фактический текст вопроса, основанный на QuestionId.

BusUnitId, QuestionId ParticipantId, QuestionId

Теперь предполагая записи с QuestionNum от 1 до 6. BusUnitQuestions имеет 3 записи, так QuestionNum 1 до 3 должны присоединиться к вопросу о QuestionID от BusUnitQuestions и QuestionNum 4 до 6 должны присоединиться к вопросу на QuestionId's из участников-участников. Я предполагаю, что мне нужно использовать ROW_NUMBER() в подзапросе из BusUnitQuestions, чтобы присоединиться к моей таблице ответов, но после этого я потерялся.

Если меня кто-нибудь понимает, есть ли у вас какие-либо предложения?

Ниже приведен пример установки. В этом случае участник ответил на 5 вопросов (от 1 до 5). Первые три из этих вопросов задаются отделом участника, а последние два выбраны участником. На самом деле для отдела и участника на выбор существует более 5 вопросов. Мне нужно подключиться к таблице «Вопросы» в таблицу «Ответы», используя номера строк в «Десятичные вопросы» и «Участники», соответствующие «QuestionNum» в таблице «Ответы».

create table Answers (AnswerId int identity(1,1), ParticipantId int, DeptId int, QuestionNum int, AnswerScore int) 
create table Dept_Question (DqId int identity(1,1), DeptId int, QuestionId int) 
create table Particpant_Question (PqId int identity(1,1), ParticipantId int, QuestionId int) 
create table Questions (QuestionId int identity(1,1), QuestionText nvarchar(200)) 

insert Questions (QuestionText) values ('What is a duck?') 
insert Questions (QuestionText) values ('How much do you weigh?') 
insert Questions (QuestionText) values ('Why does orange fit?') 
insert Questions (QuestionText) values ('Who pokes the fish?') 
insert Questions (QuestionText) values ('Why no cow bells?') 

insert Dept_Question (DeptId, QuestionId) values (3, 3) 
insert Dept_Question (DeptId, QuestionId) values (3, 4) 
insert Dept_Question (DeptId, QuestionId) values (3, 1) 

insert Particpant_Question(ParticipantId, QuestionId) values (1, 2) 
insert Particpant_Question(ParticipantId, QuestionId) values (1, 4) 

insert Answers (ParticipantId, DeptId, QuestionNum, AnswerScore) values (1, 3, 1, 63) 
insert Answers (ParticipantId, DeptId, QuestionNum, AnswerScore) values (1, 3, 2, 89) 
insert Answers (ParticipantId, DeptId, QuestionNum, AnswerScore) values (1, 3, 3, 44) 
insert Answers (ParticipantId, DeptId, QuestionNum, AnswerScore) values (1, 3, 4, 54) 
insert Answers (ParticipantId, DeptId, QuestionNum, AnswerScore) values (1, 3, 5, 72) 
+0

ли вы предоставить некоторые примеры DDL? – codingbadger

+1

Чтобы добавить запрос Barry, отправьте DDL (CREATE TABLE statements), некоторые примеры данных для каждой таблицы (надеюсь, как заявления INSERT) и ожидаемые результаты.Это намного проще для людей, чтобы ответить на такие вопросы, если мы можем написать фактический SQL против базы данных и отладить его, прежде чем положить его в ответ –

+0

Я добавил скрипт установки. – ProfK

ответ

1

Из чего я понимаю, у вас есть один список ответов, но вопрос может быть в любой из нескольких таблиц. Есть два подхода, которые вы могли бы предпринять, чтобы получить это: либо пару LEFT JOINs с ISNULL, либо вы можете создать VIEW, который является UNION ваших таблиц вопросов и JOIN.

Если это только один запрос, и вы не будете добавлять больше типов вопросов в будущем, первое, вероятно, будет проще, но если вы будете делать это часто (добавление типов вопросов или запрос данных) , Я бы пошел с методом 2, так как вам нужно будет только просматривать представление, а не ваши исходные запросы.

МЕТОД 1:.

SELECT a.ParticipantId, a.QuestionId, a.AnswerId, ISNULL(q1.QuestionText, q2.QuestionText, NULL) as QuestionText 
    FROM Answers a 
    LEFT 
    JOIN Question1 q1 /* BusinessUnitQuestions? */ 
    ON a.QuestionId = q1.QuestionId 
    LEFT 
    JOIN Question2 q2 /* ParticipantQuestions? */ 
    ON a.QuestionId = q2.QuestionId 

Таким образом, текст вопроса будет извлечено независимо от того, какая таблица представляется в

МЕТОД 2:

Во-первых, создать просмотрите с UNION все ваши вопросы, например (добавьте столько союзов, сколько хотите):

CREATE VIEW AllQuestions 
AS 
SELECT QuestionId, QuestionText 
    FROM Question1 
UNION ALL 
SELECT QuestionId, QuestionText 
    FROM Question2 

Затем вы можете использовать представление в упрощенной версии первого запроса:

SELECT a.ParticipantId, a.QuestionId, a.AnswerId, q.QuestionText 
    FROM Answers a 
    JOIN AllQuestions q 
    ON a.QuestionId = q.QuestionId 
+0

+1, но для союза a) используйте UNION ALL, потому что производительность значительно лучше b) рассмотрите вопрос о добавлении типа вопроса в качестве постоянного выражения, чтобы отразить, из какой таблицы возникает вопрос – Unreason

+0

@Unreason: я изменил его на UNION ALL - I забыть, что UNION требует сортировки и сравнения, тогда как UNION ALL не делает. – SqlRyan

Смежные вопросы