Oracle'da WITH yan tümcesinin MySQL eşdeğeri var mı?
Oracle'da WITH yan tümcesinin MySQL eşdeğeri var mı?
Yanıtlar:
Yok. Kişi geliştirene kadar (MySQL açık kaynak kodludur, herkes katkıda bulunabilir.)
ANSI / ISO SQL WITH
anahtar sözcüğü, Ortak Tablo İfadelerini (CTE'ler) tanımlamak için kullanılır ve bir veya birkaç iç içe başvuru ile karmaşık sorguları basitleştirir. Oracle, Postgres, SQL-Server, DB2'de mevcuttur ancak MySQL'de mevcut değildir.
Son sorgu FROM
, ortak tablo ifadelerinden herhangi birine bir veya daha fazla kez (genellikle yan tümcedeki, ancak başka bir kısımda olabilir) referanslara sahip olabilir. Sorgu, türetilmiş tablolar kullanılarak MySQL'de (CTE'ler olmadan) yazılabilir, ancak referansların tekrar tekrar yapılması gerekir.
50'lerde ve Temmuz ayında doğan herkesi ve aynı yılda doğan tüm kişilerin sayısını gösteren aptalca bir sorgu örneği:
WITH a AS
( SELECT name, birthdate, YEAR(birthdate) AS birthyear
FROM persons
WHERE birthdate >= '1950-01-01' AND birthdate < '1960-01-01'
)
, b AS
( SELECT birthyear, COUNT(*) AS cnt
FROM a
GROUP BY birthyear
)
SELECT a.name, a.birthdate, b.cnt AS number_of_births
FROM a JOIN b
ON a.birthyear = b.birthyear
WHERE MONTH(a.birthdate) = 7 ;
MySQL'de şu şekilde yazılabilir:
SELECT a.name, a.birthdate, b.cnt AS number_of_births
FROM
( SELECT name, birthdate, YEAR(birthdate) AS birthyear
FROM persons
WHERE birthdate >= '1950-01-01' AND birthdate < '1960-01-01'
) AS a
JOIN
( SELECT birthyear, COUNT(*) AS cnt
FROM
( SELECT name, birthdate, YEAR(birthdate) AS birthyear
FROM persons
WHERE birthdate >= '1950-01-01' AND birthdate < '1960-01-01'
) AS aa
GROUP BY birthyear
) AS b
ON a.birthyear = b.birthyear
WHERE MONTH(a.birthdate) = 7 ;
Türetilmiş tablo için kod çoğaltılması dikkat edin a
. Daha karmaşık sorgularda, kodun birden çok kez yazılması gerekir.
Bu işe yarayacak, ancak aynı deyimi birkaç kez yürütmemek için WITH yantümcesini kullanmanın avantajını sağlamayacak yazık (karmaşık sorgular ile veritabanı motoru için yavaş ve çok talepkar olabilir; acı çektim) .
Orijinal WITH yan tümcesinde tanımlanan her SELECT'i kendi geçici tablosuna eklemenizi ve bunları sorgu içinde kullanmanızı öneririm . MySQL'de, kullanıcı oturumu sona erdiğinde geçici tablo kendini bırakır.
DÜZENLE:
Ben sadece bu cevabı açıkça MySQL ile 3 geçici çözüm ortaya koyar benzer bir iş parçacığı gördüm :
/programming//a/1382618/2906290
ve oturumunuza devam etmeniz ve bu kaynakları serbest bırakmak istediğinizde geçici tabloları oluşturan ve bırakan MySQL prosedürünün bir örneği (sadece sözdiziminin bir örneği olarak kullanacağım): /programming//a/ 5553145/2906290