Pertanyaan MySQL "DENGAN" klausa


Saya mencoba menggunakan MySQL untuk membuat tampilan dengan klausa "DENGAN"

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

Tetapi sepertinya tidak mendukung MySQL ini.

Saya pikir ini cukup standar dan saya yakin Oracle mendukung ini. Apakah ada pula untuk memaksa MySQL untuk menggunakan "DENGAN" klausul? Saya sudah mencobanya dengan mesin MyISAM dan innoDB. Keduanya tidak berfungsi.


75
2017-11-28 01:43


asal


Jawaban:


Pembaruan: MySQL 8.0 akhirnya mendapatkan fitur ekspresi tabel umum, termasuk CTEs rekursif.

Inilah blog yang mengumumkannya: http://mysqlserverteam.com/mysql-8-0-labs-recursive-common-table-expressions-in-mysql-ctes/

Di bawah ini adalah jawaban saya sebelumnya, yang saya tulis pada tahun 2008.


MySQL tidak mendukung queri menggunakan WITH sintaks didefinisikan dalam SQL-99, juga disebut Ekspresi Tabel Umum.

Ini telah menjadi permintaan fitur untuk MySQL sejak Januari 2006: http://bugs.mysql.com/bug.php?id=16244

Produk RDBMS lainnya yang mendukung ekspresi tabel umum:

Database lain yang kurang mendukung untuk klausa WITH (per Februari 2014):


87
2017-11-28 07:49



Anda mungkin tertarik dengan sesuatu seperti ini:

select * from (
    select * from table
) as Subquery

12
2018-02-11 21:07



Anda punya hak sintaks:

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

Namun, seperti yang disebutkan orang lain, MySQL tidak mendukung perintah ini. DENGAN ditambahkan dalam SQL: 1999; versi terbaru dari standar SQL adalah SQL: 2008. Anda dapat menemukan beberapa informasi lebih lanjut tentang basisdata yang mendukung berbagai fitur SQL: 1999 Wikipedia.

MySQL secara tradisional tertinggal sedikit dalam mendukung standar SQL, sedangkan database komersial seperti Oracle, SQL Server (baru-baru ini), dan DB2 telah mengikuti mereka sedikit lebih dekat. PostgreSQL biasanya cukup memenuhi standar juga.

Anda mungkin ingin melihat peta jalan MySQL; Saya tidak sepenuhnya yakin kapan fitur ini mungkin didukung, tetapi sangat bagus untuk membuat kueri pengguliran yang dapat dibaca.


11
2018-05-14 17:07



Oracle mendukung.

Akan terlihat seperti ini.

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

@HALAT DENGAN sulit untuk google karena itu kata umum biasanya dikecualikan dari pencarian.

Anda akan ingin melihat Pilih dokumen untuk melihat cara kerja faktorisasi subquery.

Saya tahu ini tidak menjawab OP tetapi saya membersihkan kebingungan yang mungkin telah Anda mulai.


5
2017-11-28 02:15



Apakah Anda pernah mencoba Temporary Table? Ini memecahkan convern saya:

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

Kemudian Anda dapat menggunakan tabel ini di setiap pilih di sesi ini:

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

1
2018-02-26 08:53



Berdasarkan jawaban dari @Mosty Mostacho, berikut ini cara Anda melakukan sesuatu yang setara di MySQL, untuk kasus tertentu dalam menentukan entri apa yang tidak ada dalam tabel, dan tidak ada dalam basis data lainnya.

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

Anda mungkin ingin menggunakan editor teks dengan kemampuan makro untuk mengonversi daftar nilai ke klausa pilih serikat yang dikutip.


1
2017-10-31 23:44



MariaDB sekarang mendukung DENGAN. MySQL untuk saat ini tidak. https://mariadb.com/kb/en/mariadb/with/


0
2018-06-11 07:25