आप इसे 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>
. डाल सकते हैं प्रति परिणाम एक पंक्ति है, क्योंकि प्रत्येक 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')
अधिक विवरण के लिए मेरे ब्लॉग में इस प्रविष्टि को देखें:
- गतिशील धुरी