Saya mengubah semua kueri SQL Server saya ke MySQL dan kueri yang ada WITH
di dalamnya semuanya gagal. Berikut contohnya:
WITH t1 AS
(
SELECT article.*, userinfo.*, category.*
FROM question
INNER JOIN userinfo ON userinfo.user_userid = article.article_ownerid
INNER JOIN category ON article.article_categoryid = category.catid
WHERE article.article_isdeleted = 0
)
SELECT t1.*
FROM t1
ORDER BY t1.article_date DESC
LIMIT 1, 3
mysql
common-table-expression
with-clause
subquery-factoring
mysql-8.0
pengguna161433
sumber
sumber
Jawaban:
MySQL sebelum versi 8.0 tidak mendukung klausa WITH (CTE dalam bahasa SQL Server; Subquery Factoring di Oracle), jadi Anda harus menggunakan:
Permintaan fitur tersebut dimulai pada tahun 2006.
Seperti yang disebutkan, Anda memberikan contoh yang buruk - tidak perlu melakukan subselect jika Anda tidak mengubah output kolom dengan cara apa pun:
Inilah contoh yang lebih baik:
sumber
Tim Pengembang Mysql mengumumkan bahwa versi 8.0 akan memiliki Common Table Expressions di MySQL (CTEs) . Jadi dimungkinkan untuk menulis kueri seperti ini:
sumber
Dalam Sql, pernyataan with menentukan kumpulan hasil bernama sementara, yang dikenal sebagai ekspresi tabel umum (CTE). Ini dapat digunakan untuk kueri rekursif, tetapi dalam kasus ini, ditetapkan sebagai subset. Jika mysql memungkinkan untuk sub-pilihan saya akan mencoba
sumber
Saya mengikuti tautan yang dibagikan oleh lisachenko dan menemukan tautan lain ke blog ini: http://guilhembichot.blogspot.co.uk/2013/11/with-recursive-and-mysql.html
Posting ini menjabarkan cara meniru 2 penggunaan SQL DENGAN. Penjelasan yang sangat bagus tentang bagaimana ini bekerja untuk melakukan kueri yang mirip dengan SQL WITH.
1) Gunakan DENGAN agar Anda tidak perlu melakukan sub-kueri yang sama beberapa kali
2) Kueri rekursif dapat dilakukan dengan prosedur tersimpan yang membuat panggilan mirip dengan kueri rekursif.
Dan ini adalah kode atau prosedur yang tersimpan
sumber
Fitur 'Common Table Expression' tidak tersedia di MySQL, jadi Anda harus pergi ke membuat tampilan atau tabel sementara untuk menyelesaikannya, di sini saya telah menggunakan tabel sementara.
Prosedur tersimpan yang disebutkan di sini akan memenuhi kebutuhan Anda. Jika saya ingin mendapatkan semua anggota tim saya dan anggota terkait mereka, prosedur tersimpan ini akan membantu:
Kode:
Ini bisa disebut menggunakan:
sumber
Fitur itu disebut ekspresi tabel umum http://msdn.microsoft.com/en-us/library/ms190766.aspx
Anda tidak akan dapat melakukan hal yang tepat di mySQL, hal termudah mungkin adalah membuat tampilan yang mencerminkan CTE itu dan cukup pilih dari tampilan. Anda dapat melakukannya dengan subkueri, tetapi kinerjanya sangat buruk. Jika Anda mengalami CTE yang melakukan rekursi, saya tidak tahu bagaimana Anda dapat membuatnya kembali tanpa menggunakan prosedur tersimpan.
EDIT: Seperti yang saya katakan di komentar saya, contoh yang Anda posting tidak memerlukan CTE, jadi Anda harus menyederhanakannya untuk pertanyaan karena hanya dapat ditulis sebagai
sumber
CREATE/DROP VIEW
), dan Anda dapat memberikan hak istimewa pada tampilan.Saya menyukai jawaban @ Brad dari utas ini , tetapi ingin cara menyimpan hasil untuk diproses lebih lanjut (MySql 8):
Yang menghasilkan:
sumber