DBAtlas · Veritabanı operasyon atlası

WITH (Common Table Expression / CTE)

Oracle

WITH bolge AS (
  SELECT il, COUNT(*) AS n
  FROM musteri
  GROUP BY il
)
SELECT il, n FROM bolge WHERE n > 10;

WITH bir sorgunun içinde adlandırılmış geçici sonuç kümesi (CTE) tanımlar; alt sorguyu tekrar tekrar yazmak yerine bir kez tanımlayıp isimle kullanmanızı sağlar. Karmaşık sorguları okunur parçalara böler. Oracle 9i'den beri desteklenir.

PostgreSQL

WITH bolge AS (
  SELECT il, COUNT(*) AS n
  FROM musteri
  GROUP BY il
)
SELECT il, n FROM bolge WHERE n > 10;

CTE karmaşık sorguları adlandırılmış bloklara ayırır. PostgreSQL 12 öncesinde CTE bir optimizasyon sınırıydı (materyalize edilirdi); 12+ sürümde satır içine alınabilir, istenirse WITH ... AS MATERIALIZED ile eski davranış zorlanabilir.

MySQL

WITH bolge AS (
  SELECT il, COUNT(*) AS n
  FROM musteri
  GROUP BY il
)
SELECT il, n FROM bolge WHERE n > 10;

CTE sorgu içinde geçici adlandırılmış sonuç kümesi tanımlar ve okunabilirliği artırır. MySQL 8.0 (ve MariaDB 10.2) ile desteklenir; daha eski sürümlerde türetilmiş tablo (FROM içinde alt sorgu) kullanmak gerekir.

SQL Server

WITH bolge AS (
  SELECT il, COUNT(*) AS n
  FROM musteri
  GROUP BY il
)
SELECT il, n FROM bolge WHERE n > 10;

CTE adlandırılmış geçici sonuç kümesidir. SQL Server'da CTE'den hemen önceki ifade noktalı virgülle bitmelidir; bu yüzden WITH çoğu zaman ';WITH' biçiminde yazılır. Tek bir deyim (SELECT/INSERT/UPDATE/DELETE) süresince geçerlidir.

MongoDB

// En yakın karşılık: aggregation pipeline aşamaları
db.musteri.aggregate([
  { $group: { _id: "$il", n: { $sum: 1 } } },
  { $match: { n: { $gt: 10 } } }
])

MongoDB'de SQL/CTE yoktur; aynı işi aggregation pipeline aşamaları yapar. Her aşama bir önceki aşamanın çıktısını girdi alır, böylece CTE zincirlerine benzer adım adım işleme sağlanır. Ara sonuçlar için $facet veya $lookup da kullanılabilir.

Redis

# Uygulanamaz: Redis'te SQL ve CTE kavramı yoktur.

Redis bir anahtar-değer veri deposudur, sorgu dili yoktur. Geçici hesaplama sonuçlarını istemci tarafında birleştirir veya sunucu tarafı mantık için Lua script (EVAL) kullanırsınız.

Elasticsearch

# Elasticsearch SQL kullanımında CTE desteklenmez.
POST _sql
{ "query": "SELECT il, COUNT(*) n FROM musteri GROUP BY il HAVING COUNT(*) > 10" }

Elasticsearch SQL (_sql API) WITH/CTE söz dizimini desteklemez; gruplama ve süzme tek SELECT ile yazılır. Yerel yaklaşımda ise aynı iş 'terms' agregasyonu ve 'bucket_selector' pipeline agregasyonu ile yapılır.

DBAtlas'ta aç →