Bence asıl sorun, tüm veritabanlarının Ortak Tablo İfadelerini desteklememesidir.
İşverenim birçok şey için DB / 2 kullanıyor. Bunun en son sürümleri CTE'leri desteklemektedir, öyle ki ben böyle şeyleri yapabiliyorum:
with custs as (
select acct# as accountNumber, cfname as firstName, clname as lastName,
from wrdCsts
where -- various criteria
)
, accounts as (
select acct# as accountNumber, crBal as currentBalance
from crzyAcctTbl
)
select firstName, lastName, currentBalance
from custs
inner join accounts on custs.accountNumber = accounts.accountNumber
Sonuç olarak, tablo / alan adlarını çok kısaltabiliriz ve esasen daha sonra kullanabileceğim daha okunaklı adlara sahip geçici görünümler oluşturuyorum. Tabii ki, sorgu uzar. Ancak sonuç, açıkça açıkça ayrılan bir şey yazabildiğimdir (CTE'leri DRY'yi almak için işlevleri kullandığınız şekilde) ve oldukça okunaklı bir kodla bitirdim. Ve alt sorgularımı kırabildiğim ve bir alt sorguya başka bir referans gönderebildiğim için hepsi "satır içi" değil. Bazen bir CTE yazdım, sonra dört referanslı CTE'nin hepsine referansta bulundum, sonra ana sorgu sendikasının bu son dört sonucun sonuçlarını aldım.
Bu yapılabilir:
- DB / 2
- PostGreSQL
- torpil
- MS SQL Sunucusu
- MySQL (en son sürüm; yine de yeni)
- muhtemelen diğerleri
Ancak, kodu daha temiz, daha okunaklı, daha kuru hale getirmek için UZUN bir yol kat ediyor.
Çeşitli sorulara ekleyebileceğim, yeni sorgumda uçmaya başladığım "standart bir kütüphane" geliştirdim. Bazıları da benim organizasyonumdaki diğer devler tarafından benimsendi.
Zamanla, bunlardan bazılarını görünümlere dönüştürmek mantıklı olabilir, öyle ki, bu "standart kütüphane" kopyalamak / yapıştırmak zorunda kalmadan kullanılabilir. Ancak CTE'lerim, tek bir CTE'ye sahip olamadığım çeşitli ihtiyaçlar için, biraz modsuz, bir görünüm oluşturmaya değecek kadar YÜKSEK olarak kullanamadığım çeşitli ihtiyaçlar için ince ayar yapıldı.
Görünüşe göre suçunun bir kısmı "neden CTE'leri bilmiyorum?" veya "neden DB'm CTE'leri desteklemiyor?"
Güncellemelere gelince ... evet, CTE'leri kullanabilirsiniz, ancak benim deneyimlerime göre, bunları set cümlesi içinde ve where cümlesi içinde kullanmak zorundasınız. Bütün güncelleme ifadesinden bir veya daha fazlasını tanımlayabilir ve ardından set / where cümlelerinde "ana sorgu" kısımlarına sahip olmanız iyi olur, ancak bu şekilde çalışmaz. Ayrıca, güncellemekte olduğunuz tablodaki belirsiz tablo / alan adlarından kaçının.
Silmek için CTE'leri kullanabilirsiniz. Bu tablodan silmek istediğiniz kayıtların PK / FK değerlerini belirlemek birden fazla CTE alabilir. Yine, değiştirdiğiniz tablodaki belirsiz tablo / alan adlarını önleyemezsiniz.
Eklentiyi seçmek için yapabileceğiniz gibi insomuch, kesici uçlar için CTE'leri kullanabilirsiniz. Her zaman olduğu gibi, değiştirdiğiniz tablodaki karanlık tablo / alan adlarıyla ilgileniyor olabilirsiniz.
SQL, tabloları, alıcıları / ayarlayıcıları içeren bir tablo nesnesinin eşdeğerini oluşturmanıza izin vermiyor. Bunun için, daha yordamsal / OO programlama dili ile birlikte bir tür ORM kullanmanız gerekecektir. Java / Hibernate'de bu tür şeyler yazdım.