Не можете да го направите с SQL
(освен при динамични заявки), освен ако не знаете броя на колоните (т.е. въпроси) по време на проектиране.
Трябва да изтеглите данните, които искате, в табличен формат и след това да ги обработите от страна на клиента:
SELECT *
FROM Question
LEFT OUTER JOIN
Response
ON Response.QuestionId = Question.QuestionID
или вероятно това (в SQL Server 2005+
, Oracle 8i+
и PostgreSQL 8.4+
):
SELECT *
FROM (
SELECT q.*, ROW_NUMBER() OVER (ORDER BY questionID) AS rn
FROM Question q
) q
LEFT OUTER JOIN
(
SELECT r.*, ROW_NUMBER() OVER (PARTITION BY questionID ORDER BY ResponseID) AS rn
FROM Response r
) r
ON r.QuestionId = q.QuestionID
AND q.rn = r.rn
ORDER BY
q.rn, q.QuestionID
Последната заявка ще ви даде резултати в този формуляр (при условие че имате 4
въпроси):
rn question response
--- --- ---
1 Question 1 Response 1.1
1 Question 2 Response 2.1
1 Question 3 Response 3.1
1 Question 4 Response 4.1
2 Question 1 Response 1.2
2 Question 2 Response 2.2
2 Question 3 NULL
2 Question 4 Response 4.2
3 Question 1 NULL
3 Question 2 NULL
3 Question 3 Response 3.3
3 Question 4 NULL
, това ще изведе данните в табличен вид, с rn
маркиране на номера на реда.
Всеки път, когато видите rn
промяна на клиента, просто затваряте <tr>
и отворете новия.
Можете спокойно да поставите своя <td>
's по един на ред от набор от резултати, тъй като същият номер или редове гарантирано ще бъдат върнати за всеки rn
Това е доста често задаван въпрос.
SQL
просто не е подходящ инструмент за връщане на данни с динамичен брой колони.
SQL
работи с набори, а оформлението на колоните е имплицитно свойство на набор.
Трябва да дефинирате оформлението на набора, който искате да получите по време на проектиране, точно както дефинирате типа данни на променлива в C
.
C
работи със строго дефинирани променливи, SQL
работи със строго определени набори.
Имайте предвид, че не казвам, че това е най-добрият възможен метод. Това е просто начинът SQL
работи.
Актуализация:
В SQL Server
, можете да изтеглите таблицата в HTML
формуляр направо от базата данни:
WITH a AS
(
SELECT a.*, ROW_NUMBER() OVER (PARTITION BY question_id ORDER BY id) AS rn
FROM answer a
),
rows AS (
SELECT ROW_NUMBER() OVER (ORDER BY id) AS rn
FROM answer a
WHERE question_id =
(
SELECT TOP 1 question_id
FROM answer a
GROUP BY
question_id
ORDER BY
COUNT(*) DESC
)
)
SELECT (
SELECT COALESCE(a.value, '')
FROM question q
LEFT JOIN
a
ON a.rn = rows.rn
AND a.question_id = q.id
FOR XML PATH ('td'), TYPE
) AS tr
FROM rows
FOR XML PATH(''), ROOT('table')
Вижте този запис в моя блог за повече подробности:
- Динамично завъртане