2010-09-15 14 views
12

जब मैं निम्नलिखित चलाने मैं एक सिंटैक्स त्रुटि मिलती है:एक चयन क्वेरी (तालिका के बजाए) से COLUMNS कैसे दिखाएं?

show columns from (select * from (select * from my_table) as T) 

मैं एक प्रश्न है कि मैं ने लिखा है, बजाय एक मेज से से कॉलम कैसे दिखा सकते हैं?

SHOW COLUMNS FROM (select * from my_table) T 

या सीधे SHOW COLUMNS FROM my_table

+0

क्या आप बस एक तालिका और उनकी संबंधित जानकारी से जुड़े कॉलम पुनर्प्राप्त करना चाहते हैं? –

+0

हाँ लेकिन डायनामिक क्वेरी से, तालिका –

+3

से नहीं, परिणाम सेट के बारे में मेटाडेटा लाने के लिए एपीआई हैं। आप किस प्रोग्रामिंग भाषा पर्यावरण का उपयोग करते हैं? अधिकांश भाषाओं के लिए समाधान होना चाहिए, लेकिन एक उदाहरण प्रदान करने के लिए मुझे यह जानने की आवश्यकता होगी कि आप किस का उपयोग करते हैं। –

उत्तर

-1

इस प्रयास करें।

इसलिए मैंने अपनी क्वेरी के साथ एक नई अस्थायी तालिका बनाई और वहां से कॉलम नाम प्राप्त किए।

/*if the exporting table was created before, then delete it*/ 
DROP TABLE IF EXISTS exportTable; 

/*create the temporary table (check if you have mySQL permission to do so)*/ 
CREATE TEMPORARY TABLE exportTable AS (your_query); 

/*get result table (this is a table, the columns names are in the first column of this table ['Field'])*/ 
SHOW COLUMNS FROM exportTable; 

अस्थायी तालिका सत्र संदर्भ में बनाई गई है, और जब सत्र बंद कर दिया है droped कर दिया जाएगा। शो कॉलम टेबल के लिए भी यही है। आप सर्वर डिस्क पर इन तालिका रचनाओं के प्रभाव पर विचार कर सकते हैं।

तालिका बनाते समय आप टेम्पलेटरी कीवर्ड का उपयोग कर सकते हैं। एक टेम्पलेटरी तालिका केवल वर्तमान सत्र में दिखाई दे रही है, और सत्र बंद होने पर स्वचालित रूप से गिरा दिया जाता है। इसका मतलब है कि दो अलग-अलग सत्र एक ही अस्थायी तालिका नाम का उपयोग एक-दूसरे के साथ विवाद किए बिना या उसी नाम की मौजूदा गैर-टेम्परी तालिका के साथ कर सकते हैं। (मौजूदा तालिका तब तक छिपी हुई है जब तक अस्थायी तालिका नहीं छोड़ी जाती है।) अस्थायी तालिकाओं को बनाने के लिए, आपके पास CREEM टेम्पलेट टेबल विशेषाधिकार होना चाहिए।

http://dev.mysql.com/doc/refman/5.7/en/create-table.html

+4

मैं इस क्वेरी को नहीं चला सकता हूं 'मेरे COLtable से चुनें Mavichow

+1

@ सचिन, दोस्त यह काम नहीं करता है: 'दिखाएं कॉलम से चुनें (my_table से चुनें * टी' – Pacerier

4

इस बयान केवल मौजूदा टेबल स्वीकार की तरह लग रहा -

5

विधि 1: अस्थायी तालिका

जवाब पहले से ही एक अस्थायी तालिका का उपयोग कर के बारे में पोस्ट आमतौर पर सबसे उपयुक्त समाधान हो जाएगा। लेकिन एक महत्वपूर्ण बात यह है कि यदि प्रश्न चलाया जाता है, तो सभी शामिल होने आदि को संसाधित किया जाएगा, जो कुछ मामलों में संभावित रूप से लंबे समय तक ले सकता है। सौभाग्य से, MySQL LIMIT 0 को कोई पंक्तियां वापस करने की अनुमति देता है और documentation बताता है कि यह "तुरंत एक खाली सेट देता है"।

CREATE PROCEDURE showColumns(IN sqlToShow TEXT) 
BEGIN 
    DROP TEMPORARY TABLE IF EXISTS tempTable; 
    SET @sqlLimit0 = CONCAT('CREATE TEMPORARY TABLE tempTable AS (SELECT * FROM (', 
          sqlToShow, ') subq LIMIT 0)'); 
    PREPARE stmt FROM @sqlLimit0; 
    EXECUTE stmt; 
    DEALLOCATE PREPARE stmt; 
    SHOW COLUMNS FROM tempTable; 
END; 

एक महत्वपूर्ण बात यह है: निम्न संग्रहीत प्रक्रिया इनपुट के रूप में एक एसक्यूएल क्वेरी स्ट्रिंग ले रही है, LIMIT 0 साथ यह लपेटकर, गतिशील क्वेरी चलाने अस्थायी तालिका निर्माण करने के लिए और फिर अपने कॉलम दिखा कर आप के लिए यह काम करेगा पास की गई क्वेरी में अंत में अर्ध-कॉलन नहीं होना चाहिए। (संग्रहीत प्रक्रिया अनुगामी अर्द्ध कोलन को दूर करने के लिए संशोधित किया जा सकता है यदि आवश्यक हो लेकिन मैं इसे सरल रखने के लिए करना चाहता था।)

यहाँ एक रहते कार्रवाई में यह दिखा डेमो है: http://rextester.com/NVWY58430

विधि 2: INFORMATION_SCHEMA।कॉलम

ही जानकारी SHOW COLUMNS द्वारा लौटाए भी INFORMATION_SCHEMA.COLUMNS तालिका से सीधे प्राप्त किया जा सकता:

SELECT TABLE_NAME AS `Table`, 
     COLUMN_NAME AS `Field`, 
     COLUMN_TYPE AS `Type`, 
     IS_NULLABLE AS `Null`, 
     COLUMN_KEY AS `Key`, 
     COLUMN_DEFAULT AS `Default`, 
     EXTRA AS `Extra` 
FROM `INFORMATION_SCHEMA`.`COLUMNS` 
WHERE `TABLE_SCHEMA` = SCHEMA() -- This uses the current schema 
    AND `TABLE_NAME` IN ('table1', 'table2', 'etc.'); 
    -- ...or could go even further and restrict to particular columns in tables if desired 

तालिका की आवश्यकता होती है (और वैकल्पिक स्तंभ) नाम का नुकसान से ऊपर ग्रस्त मैन्युअल रूप से दर्ज किया जाना है और SELECT में उपनाम नाम नहीं दिखा रहा है लेकिन यह मूल कार्य करता है। इसके फायदे यह और अस्थायी तालिका बनाने की अनुमति जानकारी लौटे इस तरह अधिकतम वर्ण सीमा, संख्यात्मक परिशुद्धता/पैमाने, स्तंभ टिप्पणियों आदि के रूप में आगे स्तंभ में जानकारी प्रदान करने के लिए बढ़ाया जा सकता है करने के लिए उपयोगकर्ता की आवश्यकता नहीं है कर रहे हैं

+0

यह विशिष्ट डेटाबेस के साथ काम करता है जैसे यह इंटर्ससिस्टम कैश डेटाबेस –

+0

के लिए काम नहीं करेगा प्रश्न MySQL के लिए है - कृपया नीचे दिए गए टैग देखें यह। –

5

मैं माइस्क्ल क्वेरी से कॉलम पुनर्प्राप्त करने के लिए जावा का उपयोग कर रहा हूं।

PreparedStatement stmt = null; 
ResultSet result = null; 
ResultSetMetaData meta = null; 

try { 
    stmt = con.prepareStatement("SELECT * FROM MyTable"); 
    result = stmt.executeQuery(); 
} catch (SQLException e) { 
    System.out.println("SQLException: "+e.getMessage()); 
    System.exit(1); 
} 
System.out.println("Successful query"); 

try { 
    meta = result.getMetaData(); 
    System.out.println("Total columns: " + meta.getColumnCount()); 
    System.out.println("Name of column 1: " + meta.getColumnName(1)); 
    System.out.println("Type of column 1: " + meta.getColumnTypeName(1)); 

    System.out.println("Name of column 2: " + meta.getColumnName(2)); 
    System.out.println("Type of column 2: " + meta.getColumnTypeName(2)); 
} catch (SQLException e) { 
    System.out.println("SQLException: "+e.getMessage()); 
    System.exit(1); 
} 
System.out.println("Successful metadata report"); 

मेरे तालिका घोषित किया जाता है:: मेरे उदाहरण जावा के

CREATE TABLE `MyTable` (
    `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, 
    `name` varchar(255) DEFAULT NULL, 
    PRIMARY KEY (`id`) 
); 

आउटपुट

एक परिणाम के सेट के लिए स्तंभ जानकारी पाने के लिए जावा में सबसे अच्छा तरीका है ResultSetMetaData इंटरफ़ेस का उपयोग करने के लिए है कोड:

Successful query 
Total columns: 2 
Name of column 1: id 
Type of column 1: BIGINT UNSIGNED 
Name of column 2: name 
Type of column 2: VARCHAR 
Successful metadata report 

आप अपने नाम और डेटा प्रकारों के अलावा परिणाम सेट कॉलम के बारे में अन्य जानकारी प्राप्त कर सकते हैं। ResultSetMetaData इंटरफ़ेस पर पूर्ण संदर्भ दस्तावेज़ों के लिए http://docs.oracle.com/javase/8/docs/api/java/sql/ResultSetMetaData.html देखें।

संबंधित मुद्दे