Anda tidak dapat melakukannya dengan SQL
(kecuali dengan kueri dinamis), kecuali jika Anda mengetahui jumlah kolom (mis. pertanyaan) dalam waktu desain.
Anda harus menarik data yang Anda inginkan dalam format tabel dan kemudian memprosesnya di sisi klien:
SELECT *
FROM Question
LEFT OUTER JOIN
Response
ON Response.QuestionId = Question.QuestionID
atau, mungkin, ini (dalam SQL Server 2005+
, Oracle 8i+
dan 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
Kueri terakhir akan memberi Anda hasil dalam formulir ini (asalkan Anda memiliki 4
pertanyaan):
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
, ini dia akan menampilkan data dalam bentuk tabel, dengan rn
menandai nomor baris.
Setiap kali Anda melihat rn
mengubah pada klien, Anda hanya menutup <tr>
dan buka yang baru.
Anda dapat dengan aman meletakkan <td>
. Anda satu per baris hasil, karena nomor atau baris yang sama dijamin akan dikembalikan untuk setiap rn
Ini adalah pertanyaan yang cukup sering diajukan.
SQL
hanya bukan alat yang tepat untuk mengembalikan data dengan jumlah kolom dinamis.
SQL
beroperasi pada himpunan, dan tata letak kolom adalah properti implisit dari suatu himpunan.
Anda harus menentukan tata letak set yang ingin Anda dapatkan dalam waktu desain, sama seperti Anda mendefinisikan tipe data variabel di C
.
C
bekerja dengan variabel yang didefinisikan secara ketat, SQL
bekerja dengan set yang ditentukan secara ketat.
Perhatikan bahwa saya tidak mengatakan itu adalah metode terbaik. Ini hanya cara SQL
bekerja.
Pembaruan:
Di SQL Server
, Anda dapat menarik tabel dalam HTML
formulir langsung dari database:
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')
Lihat entri ini di blog saya untuk detail lebih lanjut:
- Pivot dinamis