मैं MySQL के बारे में बात नहीं कर सकता, लेकिन PostgreSQL में आप से crosstab फ़ंक्शन का उपयोग कर सकते हैं। टेबलफंक मॉड्यूल:
CREATE OR REPLACE VIEW PersonAttributePivot AS
SELECT PersonId AS ID, Age, HairColor
FROM crosstab
(
'SELECT PersonId, Key, Value FROM PersonAttribute',
'SELECT DISTINCT Key FROM PersonAttribute ORDER BY Key'
)
AS
(
PersonId integer,
Age text,
HairColor text
);
क्वेरी में शामिल हों:
SELECT id, name, age, haircolor
FROM Person JOIN PersonAttributePivot USING(id)
ORDER BY id;
वांछित परिणाम:
id | name | age | haircolor
----+------------+-----+-----------
1 | Joe Bloggs | 27 |
2 | Jane Doe | | Brown
(2 rows)
जैसा कि आप देख रहे हैं कि मैंने PersonAttributePivot
. में स्तंभों की स्पष्ट सूची डाली है दृश्य। मैं निहित कॉलम सूची के साथ कोई "स्वचालित-पिवट" निर्माण तरीका नहीं जानता।
संपादित करें:
विशाल . के लिए स्तंभ सूची (हमेशा text
मानकर टाइप) एक वैकल्पिक हल के रूप में मुझे ऐसा थोड़ा संशोधित दृष्टिकोण दिखाई देता है:
गतिशील प्रकार का निर्माण (यहाँ तुच्छ रूप से जावा आधारित):
Class.forName("org.postgresql.Driver");
Connection c =
DriverManager.getConnection("jdbc:postgresql://localhost/postgres", "postgres", "12345");
Statement s = c.createStatement();
ResultSet rs = s.executeQuery("SELECT DISTINCT Key FROM PersonAttribute ORDER BY Key");
List<String> columns = new ArrayList<String>();
while (rs.next())
columns.add(rs.getString(1));
System.out.println("CREATE TYPE PersonAttributePivotType AS (");
System.out.println("\tPersonId integer,");
for (int i = 0; i < columns.size(); ++i)
{
System.out.print("\t" + columns.get(i) + " text");
if (i != columns.size() - 1)
System.out.print(",");
System.out.println();
}
System.out.println(");");
परिणाम:
CREATE TYPE PersonAttributePivotType AS (
PersonId integer,
Age text,
HairColor text
);
फ़ंक्शन रैपर:
CREATE OR REPLACE FUNCTION crosstabPersonAttribute(text, text)
RETURNS setof PersonAttributePivotType
AS '$libdir/tablefunc','crosstab_hash' LANGUAGE C STABLE STRICT;
स्वचालित दृश्य निर्माण:
CREATE OR REPLACE VIEW PersonAttributePivot AS
SELECT * FROM crosstabPersonAttribute
(
'SELECT PersonId, Key, Value FROM PersonAttribute',
'SELECT DISTINCT Key FROM PersonAttribute ORDER BY Key'
);
परिणाम:
TABLE PersonAttributePivot;
personid | age | haircolor
----------+-----+-----------
1 | 27 |
2 | | Brown
(2 rows)