Konwertuję wszystkie moje zapytania SQL Server na MySQL i wszystkie moje zapytania, które zawierają, WITH
kończą się niepowodzeniem. Oto przykład:
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
Odpowiedzi:
MySQL przed wersją 8.0 nie obsługuje klauzuli WITH (CTE w języku SQL Server; Subquery Factoring w Oracle), więc pozostaje Ci użycie:
Prośba o tę funkcję pochodzi z 2006 roku.
Jak wspomniano, podałeś kiepski przykład - nie ma potrzeby wykonywania podselekcji, jeśli w żaden sposób nie zmieniasz danych wyjściowych kolumn:
Oto lepszy przykład:
źródło
Zespół deweloperów Mysql ogłosił, że wersja 8.0 będzie miała wspólne wyrażenia tabelowe w MySQL (CTE) . Będzie można więc pisać takie zapytania:
źródło
W Sql instrukcja with określa tymczasowy nazwany zestaw wyników, znany jako wspólne wyrażenie tabelowe (CTE). Może być używany do zapytań rekurencyjnych, ale w tym przypadku określa jako podzbiór. Jeśli mysql pozwala na podselectes, spróbuję
źródło
Skorzystałem z linku udostępnionego przez lisachenko i znalazłem inny link do tego bloga: http://guilhembichot.blogspot.co.uk/2013/11/with-recursive-and-mysql.html
Post przedstawia sposoby emulacji 2 zastosowań SQL WITH. Naprawdę dobre wyjaśnienie, jak działają te zapytania, wykonując podobne zapytanie jak SQL WITH.
1) Użyj funkcji Z, aby nie trzeba było wielokrotnie wykonywać tego samego zapytania podrzędnego
2) Zapytania rekurencyjne można wykonywać za pomocą procedury składowanej, która sprawia, że wywołanie jest podobne do rekurencyjnego z zapytaniem.
A to jest kod lub procedura składowana
źródło
Funkcja „Common Table Expression” nie jest dostępna w MySQL, więc musisz przejść do widoku lub tabeli tymczasowej do rozwiązania, tutaj użyłem tabeli tymczasowej.
Wspomniana tutaj procedura składowana rozwiąże Twoje potrzeby. Jeśli chcę uzyskać wszystkich członków mojego zespołu i powiązanych z nimi członków, ta procedura składowana pomoże:
Kod:
Można to wywołać za pomocą:
źródło
Ta funkcja nosi nazwę wspólnego wyrażenia tabeli http://msdn.microsoft.com/en-us/library/ms190766.aspx
Nie będziesz w stanie zrobić dokładnie tego, co w mySQL, najłatwiej byłoby prawdopodobnie stworzyć widok, który odzwierciedla to CTE i po prostu wybrać z widoku. Możesz to zrobić za pomocą podzapytań, ale będzie to działać naprawdę słabo. Jeśli napotkasz jakiekolwiek CTE, które wykonują rekursję, nie wiem, jak mógłbyś to odtworzyć bez korzystania z procedur składowanych.
EDYCJA: Jak powiedziałem w moim komentarzu, ten przykład, który opublikowałeś, nie wymaga CTE, więc musisz go uprościć dla pytania, ponieważ można go po prostu zapisać jako
źródło
CREATE/DROP VIEW
) I możesz nadać uprawnienia do widoku.Podobała mi się odpowiedź @ Brada z tego wątku , ale chciałem zapisać wyniki do dalszego przetwarzania (MySql 8):
Który produkuje:
źródło