SQL'de, bildiğim kadarıyla, kavramsal yorumlama sırası olan mantıksal sorgu işleme sırası FROM ile şu şekilde başlar:
- DAN
- NEREDE
- GRUPLA
- HAVING
- SEÇ
- TARAFINDAN SİPARİŞ
Bu listeyi izleyerek neden WHERE yan tümcesinde SELECT takma adlarına sahip olamayacağınızı görmek kolaydır, çünkü takma ad henüz oluşturulmamıştır. T-SQL (SQL Server) bunu kesinlikle takip eder ve SELECT'i geçene kadar SELECT takma adlarını kullanamazsınız.
Ancak MySQL'de SELECT takma adlarını HAVING yan tümcesinde kullanmak mümkündür (mantıksal olarak) SELECT yan tümcesinden önce işlenmesi gerekir. Bu nasıl mümkün olabilir?
Bir örnek vermek gerekirse:
SELECT YEAR(orderdate), COUNT(*) as Amount
FROM Sales.Orders
GROUP BY YEAR(orderdate)
HAVING Amount>1;
T-SQL'de ifade geçersiz (HAVING SELECT takma adına atıfta bulunduğundan Amount
) ...
Msg 207, Level 16, State 1, Line 5
Invalid column name 'Amount'.
... ama MySQL'de gayet iyi çalışıyor.
Buna dayanarak, merak ediyorum:
- MySQL kullanıcıya yardımcı olmak için SQL kurallarında bir kısayol alıyor mu? Belki bir tür ön analiz kullanıyor olabilirsiniz?
- Yoksa MySQL, tüm RDBMS'leri izlediğimden farklı bir kavramsal yorumlama sırası mı kullanıyor?
SELECT C, ROW_NUMBER() OVER (ORDER BY X) AS RN FROM T GROUP BY C HAVING RN = 1
sıra sorunlu olacak ROW_NUMBER
ishal sonrasıHAVING
SELECT @rownum:=@rownum + 1 as row ...
. Belki de SELECT takma adlarını desteklemelerinin nedeni, imkansız hale getirecek şeyleri desteklememeleri nedeniyle ... kim bilir? :)
HAVING
ve SELECT
deyimi değiştirilebilir. Yani, bunu yapmakta bir belirsizlik yoktur ve içinde korkunç ifadeler olduğunda kodun görünümünü basitleştirebilir SELECT
.