İçeriğe geç

MSSQL İç İçe Sorgular (Select In Select)

Bir tabloya select sorgusunu atarken gelecek sonuçlar içerisinde o tabloyla ilişkili belli alanların da gelmesini isteyebilirsiniz. Elbette bunun için inner join, cross join, left ve right join leri de kullanabilirsiniz. Ancak kimi durumlarda bu sorgular yeterince karmaşık hale gelebilir veya ihtiyacınızı join işlemlerinin hiçbiri göremiyor olabilir. Bu gibi durumlarda bu uygulamaya ihtiyaç duyabilirsiniz.

İşte bu tip durumlarda DBA’lar tarafından (Database Admin) çok da tavsiye edilmeyen, ancak developerlar tarafından başvurulan yöntemlerden birisi de iç içe select sorgularıdır.

İç İçe Select Kullanımı

Aşağıdaki gibi birbirine UserId ile bağlı Orders ve Users adında iki tablomuz olsun;

Burada amacımız, Orders tablosuna select atarken aynı zamanda iki alanda ilgili siparişin sahibi olan kullanıcının adını ve soyadını da getirmek olacak.

Sorgumuz aşağıdaki şekilde;

SELECT 
Id,

(SELECT [name] FROM Users WHERE Id = Orders.UserId) AS Name,
(SELECT [surname] FROM Users WHERE Id = Orders.UserId) AS Surname,

OrderNo,
OrderTotal
FROM Orders

Bu sorguyu execute ettiğimizde aşağıdaki gibi bir sonuçla karşılaşacağız:

Şimdi kodumuzu kısaca bir açalım;

(SELECT [name] FROM Users WHERE Id = Orders.UserId) AS Name,

Yukarıda da bahsettiğimiz gibi iki tablomuz UserId alanı ile bağlı. Yani Users tablosunun Id alanı, Orders tablosunun UserId alanıyla eşdeğer. Tabi burada herhangi bir bağlantı (foreingkey) yok. Sadece karşılıkları var.

İşte bu yüzden bir kolon halinde Name’i ararken normal bir şekilde araya bir PARANTEZ İÇİNDE girip sorgumuzu yazıyoruz ve sorgunun sonunda neyi aradığımız belirtir iken, şu an içinde bulunduğumuz Orders tablosundaki hangi alanın o tablodaki hangi alana denk geldiğini…

Id = Orders.UserId

…şeklinde belirtmiş oluyoruz.

Tabii ki bu örnek büyük kapsamlı bir örnek değil ve klasik inner join ile de kolayca yapılabilirdi. Ancak burada kullanıma örnek vermek adına böyle bir uygulama yapmış olduk.

İç İçe Select Kullanımının Olumsuzlukları, Zararları Nelerdir?

Yukarıdaki yazıda da bahsettiğim üzere DBA’ler her zaman bu tip sorguları sevmezler. Sebebi ise aslında haksız olmayışları. Zira bu tip bir sorguyu inner join gibi bir metodla da çalıştırabilirsiniz. Bu şekilde sorguyu bir sorguda çok fazla tabloyu ve haliyle kayıdı aratacak şekilde çalıştırırsanız MSSQL engine’ler çok fazla iş yüklenecek ve bu da diğer işlemlere ayıracakları alanı kaplayacaktır.

Kısaca şöyle düşünün; Sanki dönen yanıtın her satırında diğer tabloları her seferinde baştan aratıyor şekilde bir iş yükü doğabilecektir.

Artık daha kapsamlı uygulamalarda kimi zaman kullanmak ya da kullanmamak sizin ellerinizde.

İyi çalışmalar… 🙂

5 1 vote
Article Rating
Tarih:Microsoft SQL ServerMSSQL Server
Subscribe
Bildir
guest
0 Yorum
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x