Oracle ile WITH MySQL eşdeğeri


Yanıtlar:


16

Yok. Kişi geliştirene kadar (MySQL açık kaynak kodludur, herkes katkıda bulunabilir.)

ANSI / ISO SQL WITHanahtar 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.


Tekrardan (kodun tekrarından) kaçınmak için, değişkenleri ve geçici tabloları kullanmak daha iyi olmaz mı?
Pacerier

Kodun çoğaltılması konusunda endişelenmezdim ama kesinlikle performans nedenleriyle, geçici tablolarla bir sürümü düşünürdüm ve denerdim.
ypercubeᵀᴹ

1
Neden kodun tekrarlanması konusunda endişelenmeyeceğinizi söylüyorsunuz? Bu tamamen dağınık ve  kuru .
Pacerier

1
@Pacerier DRY her zaman DB koduyla ilgili değildir.
JNK

1
@Pacerier olmasaydı şaşırmazdım. DB motorları, doğru sonuçları döndürmeyi garanti ederken en iyi neyin işe yarayacağı konusunda eğitimli tahminler yapmalıdır. Sıcaklık tabloları genel olarak iyidir, ancak DRY, kullanıcı tanımlı işlevler gibi diğer açılardan DB'lerde korkunç performansa yol açar.
JNK

2

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 :

  • GEÇİCİ tablolar
  • TÜREV tabloları
  • satır içi görünümler (WITH deyiminin etkin bir şekilde temsil ettiği - birbirinin yerine kullanılabilir)

/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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.