2010-09-15 17 views
12

tôi nhận được một lỗi cú pháp khi tôi chạy như sau:Làm thế nào để HIỂN THỊ COLUMNS từ một truy vấn SELECT (chứ không phải là một bảng)?

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

Làm thế nào tôi có thể hiển thị các cột từ một truy vấn mà tôi đã viết, chứ không phải từ một bảng?

+0

Bạn chỉ muốn truy xuất các cột được liên kết với một bảng và thông tin tương ứng của chúng? –

+0

CÓ nhưng từ Truy vấn động, không phải từ TABLE –

+3

Có các API để tìm nạp siêu dữ liệu về tập hợp kết quả. Bạn sử dụng môi trường ngôn ngữ lập trình nào? Nên có giải pháp cho hầu hết các ngôn ngữ, nhưng để cung cấp một ví dụ tôi cần biết bạn sử dụng ngôn ngữ nào. –

Trả lời

-1

thử này -

SHOW COLUMNS FROM (select * from my_table) T 

hoặc trực tiếp SHOW COLUMNS FROM my_table

+4

Tôi không thể chạy truy vấn này 'HIỂN THỊ COLUMNS FROM (chọn * từ my_table) T' có vẻ như có lỗi. – Mavichow

+1

@Sachin, Dude này không hoạt động: 'HIỂN THỊ COLUMNS TỪ (chọn * từ my_table) T' – Pacerier

4

Hình như tuyên bố này chỉ chấp nhận bảng hiện có.

Vì vậy, tôi đã tạo một bảng tạm thời mới với truy vấn của mình và nhận tên cột từ đó.

/*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; 

Bảng tạm thời được tạo trong ngữ cảnh phiên và sẽ được thả khi phiên được đóng. Điều tương tự cũng dành cho bảng SHOW COLUMNS. Bạn có thể xem xét tác động của những sáng tạo bảng này trên đĩa máy chủ.

Bạn có thể sử dụng từ khóa TEMPORARY khi tạo bảng. Bảng tạm thời chỉ hiển thị cho phiên hiện tại và được tự động giảm khi phiên được đóng. Điều này có nghĩa là hai phiên khác nhau có thể sử dụng cùng một tên bảng tạm thời mà không xung đột với nhau hoặc với bảng không có TEMPORARY hiện có cùng tên. (Bảng hiện có được ẩn cho đến khi bảng tạm thời bị loại bỏ.) Để tạo các bảng tạm thời, bạn phải có đặc quyền TẠO TẠO TẠO TẠO TẠO.

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

5

PHƯƠNG PHÁP 1: bảng tạm thời

Những câu trả lời đã được đăng về việc sử dụng một bảng tạm thời thường sẽ là giải pháp thích hợp nhất. Nhưng có một điểm quan trọng là nếu truy vấn chạy như, tất cả các phép nối vv sẽ được xử lý, có khả năng mất nhiều thời gian trong một số trường hợp. May mắn thay, MySQL cho phép LIMIT 0 trả về không có hàng và các trạng thái documentation rằng điều này "nhanh chóng trả về một tập rỗng". Các thủ tục lưu trữ sau đây sẽ làm công việc này cho bạn bằng cách tham gia một chuỗi truy vấn SQL như là đầu vào, gói nó với LIMIT 0, chạy truy vấn năng động để tạo ra một bảng tạm thời và sau đó hiển thị các cột của nó:

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; 

Một điểm quan trọng là truy vấn được truyền vào không nên có dấu chấm phẩy ở cuối. (Nếu cần thiết, các thủ tục lưu trữ có thể được sửa đổi để loại bỏ trailing dấu chấm phẩy nhưng tôi muốn giữ nó đơn giản.)

Đây là một bản demo trực tiếp hiển thị nó trong hành động: http://rextester.com/NVWY58430

PHƯƠNG PHÁP 2: INFORMATION_SCHEMA.COLUMNS

Các thông tin tương tự được trả về bởi SHOW COLUMNS cũng có thể được lấy trực tiếp từ các INFORMATION_SCHEMA.COLUMNS bảng:

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 

Các đau khổ trên từ những nhược điểm của yêu cầu bảng (và cột tùy chọn) tên được nhập bằng tay và không hiển thị tên bí danh trong số SELECT nhưng nó thực hiện công việc cơ bản. Ưu điểm của nó là nó không yêu cầu người dùng có quyền tạo bảng tạm thời và thông tin được trả lại có thể được mở rộng để cung cấp thêm thông tin cột như độ dài ký tự tối đa, độ chính xác/tỷ lệ, cột nhận xét, v.v.

+0

nó hoạt động với cơ sở dữ liệu cụ thể như nó sẽ không làm việc cho cơ sở dữ liệu bộ đệm cơ sở dữ liệu –

+0

Câu hỏi đặt ra cho MySQL - vui lòng xem các thẻ bên dưới nó. –

5

Tôi đang sử dụng Java để truy xuất các cột từ truy vấn MySql.

Cách tốt nhất trong Java để lấy thông tin cột trong tập kết quả là sử dụng giao diện ResultSetMetaData:

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"); 

bảng của tôi là tuyên bố:

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

Output ví dụ Java của tôi mã:

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 

Bạn có thể nhận thông tin khác về các cột kết quả bên cạnh tên và kiểu dữ liệu của chúng. Xem http://docs.oracle.com/javase/8/docs/api/java/sql/ResultSetMetaData.html để xem tài liệu tham khảo đầy đủ trên giao diện ResultSetMetaData.

Các vấn đề liên quan