Nie możesz tego zrobić za pomocą SQL
(z wyjątkiem zapytań dynamicznych), chyba że znasz liczbę kolumn (tj. pytań) w czasie projektowania.
Powinieneś pobrać żądane dane w formacie tabelarycznym, a następnie przetworzyć je po stronie klienta:
SELECT *
FROM Question
LEFT OUTER JOIN
Response
ON Response.QuestionId = Question.QuestionID
lub prawdopodobnie to (w SQL Server 2005+
, Oracle 8i+
i 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
Drugie zapytanie da wyniki w tym formularzu (pod warunkiem, że masz 4
pytania):
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 będzie wyprowadzać dane w formie tabelarycznej, z rn
zaznaczając numer wiersza.
Za każdym razem, gdy zobaczysz rn
zmieniając na kliencie, po prostu zamykasz <tr>
i otwórz nowy.
Możesz bezpiecznie umieścić swój <td>
's jeden na wiersz zestawu wyników, ponieważ ta sama liczba lub wiersze zostaną zwrócone dla każdego rn
To dość często zadawane pytanie.
SQL
po prostu nie jest to właściwe narzędzie do zwracania danych z dynamiczną liczbą kolumn.
SQL
działa na zestawach, a układ kolumn jest niejawną właściwością zestawu.
Powinieneś zdefiniować układ zestawu, który chcesz uzyskać w czasie projektowania, tak jak definiujesz typ danych zmiennej w C
.
C
działa ze ściśle określonymi zmiennymi, SQL
działa ze ściśle określonymi zestawami.
Zauważ, że nie mówię, że jest to najlepsza możliwa metoda. To po prostu sposób SQL
działa.
Aktualizacja:
W SQL Server
, możesz ściągnąć tabelę w HTML
formularz bezpośrednio z bazy danych:
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')
Zobacz ten wpis na moim blogu, aby uzyskać więcej informacji:
- Dynamiczny obrót