Nemůžete to udělat pomocí SQL
(s výjimkou dynamických dotazů), pokud neznáte počet sloupců (tj. otázek) v době návrhu.
Měli byste stáhnout požadovaná data v tabulkovém formátu a poté je zpracovat na straně klienta:
SELECT *
FROM Question
LEFT OUTER JOIN
Response
ON Response.QuestionId = Question.QuestionID
nebo pravděpodobně toto (v SQL Server 2005+
, Oracle 8i+
a 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
Poslední dotaz vám poskytne výsledky v tomto formuláři (za předpokladu, že máte 4
otázky):
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
, to je to, že vypíše data v tabulkové formě s rn
označení čísla řádku.
Pokaždé, když uvidíte rn
Při změně na klientovi stačí zavřete <tr>
a otevřete nový.
Můžete bezpečně vložit svůj <td>
jeden na řádek sady výsledků, protože pro každý rn
je zaručeno vrácení stejného počtu nebo řádků
Toto je poměrně často kladená otázka.
SQL
prostě to není správný nástroj pro vrácení dat s dynamickým počtem sloupců.
SQL
funguje na množinách a rozložení sloupců je implicitní vlastností množiny.
Měli byste definovat rozložení sady, kterou chcete získat v době návrhu, stejně jako definujete datový typ proměnné v C
.
C
pracuje s přesně definovanými proměnnými, SQL
pracuje s přesně definovanými sadami.
Všimněte si, že neříkám, že je to nejlepší možná metoda. Je to prostě způsob SQL
funguje.
Aktualizace:
V SQL Server
, můžete tabulku stáhnout v HTML
formulář přímo z databáze:
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')
Další podrobnosti naleznete v tomto příspěvku na mém blogu:
- Dynamický pivot