Проблема SQL-запроса: как объединить два списка - PullRequest
2 голосов
/ 11 мая 2010

У меня есть базовая таблица участников и ответов со следующей структурой:

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, а вопрос с 4 по 6 должен присоединиться к Вопросу по QuestionId из ParticipantQuestions. Я предполагаю, что мне нужно использовать ROW_NUMBER () в подзапросе BusUnitQuestions, чтобы присоединиться к моей таблице ответов, но после этого я потерялся.

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

Ниже приведен пример установки. При этом участник ответил на 5 вопросов (с 1 по 5). Первые три из этих вопросов задаются отделом участника, а последние два выбираются участником. На самом деле существует более 5 вопросов для отдела и участника на выбор. Мне нужно присоединить таблицу вопросов к таблице ответов, используя номера строк в DepartmentQuestions и ParticipantQuestions, соответствующие 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)

1 Ответ

1 голос
/ 11 мая 2010

Насколько я понимаю, у вас есть один список ответов, но вопрос может быть в любой из нескольких разных таблиц. Есть два подхода, которые вы могли бы использовать, чтобы получить этот - либо ЛЕВЫЕ СОЕДИНЕНИЯ с ISNULL, либо вы можете создать ВИД, который является СОЮЗОМ ваших таблиц вопросов, и ПРИСОЕДИНИТЬСЯ к этому.

Если это всего лишь один запрос, и вы не будете добавлять больше типов вопросов в будущем, первый, вероятно, будет проще, но если вы собираетесь делать это часто (добавление типов вопросов или запрос данных), Я бы выбрал способ 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:

Сначала создайте представление с СОЮЗОМ всех ваших вопросов, например так (добавьте столько союзов, сколько хотите):

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...