2008-11-28 27 views
72

Tôi đang cố gắng sử dụng MySQL để tạo ra một cái nhìn với "VỚI" khoảnMySQL "VỚI" khoản

WITH authorRating(aname, rating) AS 
    SELECT aname, AVG(quantity) 
    FROM book 
    GROUP BY aname 

Nhưng nó không có vẻ như MySQL hỗ trợ này.

Tôi nghĩ điều này khá chuẩn và tôi chắc rằng Oracle hỗ trợ điều này. Có anyway để buộc MySQL để sử dụng mệnh đề "WITH"? Tôi đã thử nó với động cơ MyISAM và innoDB. Cả hai đều không hoạt động.

Trả lời

0

Lựa chọn dưới dạng giá trị thường phải nằm trong dấu ngoặc đơn.

Cập nhật: không chắc chắn cú pháp bạn đang cố gắng sử dụng. Bạn có thể hiển thị tuyên bố đầy đủ hơn không? CREATE VIEW có một câu lệnh SELECT, afaik, có thể có WITH nhưng chỉ ở nơi nó sẽ hợp lệ trong một SELECT độc lập.

Cập nhật 2: err, tôi đã nghĩ đến CASE chứ không phải WITH. Googling không hiển thị bất kỳ cú pháp WITH đặc biệt nào cho Oracle ngoại trừ WITH CHECK OPTION mà mysql cũng hỗ trợ. Hãy bắt đầu bằng cách mô tả những gì bạn đang cố gắng đạt được?

Cập nhật 3: chỉ tại một đoán, bạn có nghĩa là một cái gì đó như thế này:

chọn ... từ foo, (chọn aname trung bình (số lượng) như đánh giá từ nhóm cuốn sách của aname) như authorRating nơi ...

+0

oracle 9 trở lên hỗ trợ với – EvilTeach

5

Oracle hỗ trợ WITH.

Nó sẽ trông như thế này.

WITH emps as (SELECT * FROM Employees) 
SELECT * FROM emps WHERE ID < 20 
UNION ALL 
SELECT * FROM emps where Sex = 'F' 

@ysth WITH khó google vì đó là một từ chung thường bị loại trừ khỏi tìm kiếm.

Bạn muốn xem SELECT docs để xem cách hoạt động bao thanh toán phụ hoạt động.

Tôi biết điều này không trả lời OP nhưng tôi sẽ xóa mọi sự nhầm lẫn mà bạn có thể đã bắt đầu.

+0

Vẫn chưa rõ ràng sự nhầm lẫn của tôi. Bạn đang nói không có mệnh đề WITH nhưng có câu lệnh WITH? – ysth

+0

Ah, tôi hiểu rồi. Đó là một mệnh đề của một lựa chọn đứng trước lựa chọn. Nó có thể được sử dụng trong CREATE VIEW không? Làm thế nào là nó khác nhau từ tham gia một subselect? Tôi không thấy các ví dụ trực tuyến trong đó tên sau khi WITH có các tham số - làm thế nào để những công việc đó? – ysth

+0

Nó rất khác. Lưu ý rằng cùng một subqry được sử dụng hai lần mà không cần phải định nghĩa nó hai lần. Chắc chắn bạn có thể sao chép/dán cùng một truy vấn trong đó nhưng đây là một ví dụ đơn giản. Hãy tưởng tượng nếu mệnh đề WITH đã đi vào một trang và đã được sử dụng 4 lần trong truy vấn chính. bạn sẽ đánh giá cao nó sau đó. –

84

Cập nhật: MySQL 8.0 cuối cùng cũng nhận được tính năng của các biểu thức bảng chung, bao gồm CTE đệ quy.

Dưới đây là một blog công bố nó: http://mysqlserverteam.com/mysql-8-0-labs-recursive-common-table-expressions-in-mysql-ctes/

Dưới đây là câu trả lời trước đây của tôi, mà tôi ban đầu được viết trong 2008.


MySQL không hỗ trợ các truy vấn bằng cách sử dụng WITH cú pháp quy định tại SQL-99, còn được gọi là Biểu thức bảng chung.

Đây là một yêu cầu tính năng cho MySQL kể từ tháng 1 năm 2006: http://bugs.mysql.com/bug.php?id=16244

Các sản phẩm RDBMS có hỗ trợ biểu thức bảng chung:

khác mà thiếu sự hỗ trợ cho mệnh đề WITH (tính đến tháng 2 năm 2014):

+0

SQLite hỗ trợ mệnh đề [WITH] (https://www.sqlite.org/lang_with.html) kể từ [phiên bản 3.8.3] (http://www.sqlite.org/changes.html#version_3_8_3) được phát hành vào 2014-02-03. – Martijn

+0

Tôi đã thêm H2 và Firebird vào danh sách. –

+0

@a_horse_with_no_name, cảm ơn bạn đã bổ sung. Có lẽ chúng ta có thể xấu hổ MySQL để nâng cao mức độ ưu tiên cho yêu cầu tính năng cũ này! –

11

Bạn đã có đúng cú pháp:

WITH AuthorRating(AuthorName, AuthorRating) AS 
    SELECT aname   AS AuthorName, 
      AVG(quantity) AS AuthorRating 
    FROM Book 
    GROUP By Book.aname 

Tuy nhiên, như những người khác đã đề cập, MySQL không hỗ trợ lệnh này. WITH được thêm vào trong SQL: 1999; phiên bản mới nhất của tiêu chuẩn SQL là SQL: 2008. Bạn có thể tìm thêm một số thông tin về cơ sở dữ liệu hỗ trợ các tính năng khác nhau của SQL: 1999 trên Wikipedia.

MySQL có truyền thống tụt lại một chút để hỗ trợ cho tiêu chuẩn SQL, trong khi các cơ sở dữ liệu thương mại như Oracle, SQL Server (gần đây) và DB2 đã theo dõi chúng chặt chẽ hơn một chút. PostgreSQL thường là các tiêu chuẩn khá phù hợp.

Bạn có thể muốn xem lộ trình của MySQL; Tôi không hoàn toàn chắc chắn khi tính năng này có thể được hỗ trợ, nhưng thật tuyệt vời khi tạo truy vấn cuộn lên có thể đọc được.

10

Bạn có thể quan tâm somethinkg như thế này:

select * from (
    select * from table 
) as Subquery 
+0

bạn có thể giải thích cho Subquery không? Tôi có thể có chọn * từ ( (chọn * từ bảng 1) UNION ALL (chọn * từ bảng 2) ) Nhóm Bằng cách nào đó? –

+1

@Kathy Xin chào, 'Subquery' là tên tôi đã sử dụng cho bảng có nguồn gốc. Khi bạn sử dụng 'from (...)' bạn tạo một cái gì đó giống như một bảng tạm thời (một bảng có nguồn gốc) và nó đòi hỏi một tên. Đó là lý do tại sao tôi sử dụng 'như Subquery'. Trả lời câu hỏi của bạn, vâng, bạn có thể, nhưng bạn sẽ phải đặt tên cho bảng có nguồn gốc bên ngoài (ngay trước 'Nhóm By'). Hy vọng đã giúp. –

+0

khiến db của tôi bị treo ... –

1

Bạn đã bao giờ cố gắng Bảng tạm thời? này giải quyết convern tôi:

create temporary table abc (
column1 varchar(255) 
column2 decimal 
); 
insert into abc 
select ... 
or otherwise 
insert into abc 
values ('text', 5.5), ('text2', 0815.8); 

Sau đó, bạn có thể sử dụng bảng này trong mỗi lựa chọn trong phiên này:

select * from abc inner join users on ...; 
+0

Tôi có cần lưu ý: http://stackoverflow.com/questions/343402/getting-around-mysql-cant-reopen-table-error bạn không thể mở Bảng hai lần :-( – Claus

+0

Cách tính của tôi cho các tập dữ liệu nhỏ trong bảng: tạo bảng abc2 như abc; chèn vào abc2 chọn * từ abc; – Claus

1

xây dựng trên câu trả lời từ @Mosty Mostacho, dưới đây là cách bạn có thể làm điều gì đó tương đương trong MySQL, cho một trường hợp cụ thể xác định các mục nhập nào không tồn tại trong một bảng và không có trong bất kỳ cơ sở dữ liệu nào khác.

select col1 from (
    select 'value1' as col1 union 
    select 'value2' as col1 union 
    select 'value3' as col1 
) as subquery 
left join mytable as mytable.mycol = col1 
where mytable.mycol is null 
order by col1 

Bạn có thể muốn sử dụng trình chỉnh sửa văn bản có khả năng macro để chuyển đổi danh sách giá trị thành mệnh đề liên kết được chọn trích dẫn.

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