Kuruluş Şemasını Dolaşma
Bir çalışan-yönetici hiyerarşisini istenen derinliğe kadar izleyin.
Kuruluş Şemasını Dolaşma, CoddyKit'te ücretsiz bir SQL Interview Prep dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, SQL Interview Prep öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. SQL Interview Prep kursu toplamda 4 dersten oluşur.
Organizasyon Şeması Sorusu
“employees tablosunda id, name ve manager_id olduğunu varsayalım; belirli bir yöneticinin altında bulunan herkesi, herhangi bir derinliğe kadar listeleyin.” Bu, yinelemeli CTE'lerle ilgili en yaygın görüşme sorularından biridir.
Tablo kendine referans verir: manager_id, başka bir satırın id değerine işaret eder. Bu derste yapıyı hem aşağı doğru (astları) hem de yukarı doğru (komuta zincirini) dolaşacaksınız.
Örnek Tablo
Bu verileri gözünüzde canlandırın. CEO'nun yöneticisi NULL değerine sahiptir. Diğer herkes zincirde yukarı doğru bir yöneticiye bağlıdır.
- 1 Ada (yönetici NULL)
- 2 Ben (yönetici 1)
- 3 Cleo (yönetici 1)
- 4 Dan (yönetici 2)
- 5 Eve (yönetici 4)
Dolayısıyla derinlik şöyledir: Ada → Ben → Dan → Eve. Yapıyı dolaşırken bunu aklınızda tutun.
CREATE TABLE employees (
id INT PRIMARY KEY,
name VARCHAR(50),
manager_id INT REFERENCES employees(id)
);Bir Yöneticiden Aşağı Doğru İlerleme
Seçilen bir yöneticinin altındaki tüm astları listelemek için başlangıç üyesi o yöneticiyi (veya doğrudan astlarını) seçer, yinelemeli üye de manager_id değerini aşağı doğru izler.
Burada Ben'den (kimlik 2) başlayıp onun altındaki herkesi topluyoruz.
WITH RECURSIVE subtree AS (
SELECT id, name, manager_id, 1 AS depth
FROM employees WHERE id = 2
UNION ALL
SELECT e.id, e.name, e.manager_id, s.depth + 1
FROM employees e
JOIN subtree s ON e.manager_id = s.id
)
SELECT name, depth FROM subtree ORDER BY depth;Çıktıyı Okuma
Yukarıdaki sorgu, Ben'i 1. derinlikte, Dan'ı 2. derinlikte ve Eve'i 3. derinlikte döndürür. Başlangıç üyesi Ben'i başlangıç satırı olarak aldı; birinci yineleme yöneticisi Ben olan Dan'ı buldu; ikinci yineleme yöneticisi Dan olan Eve'i buldu; üçüncü yineleme kimseyi bulamadığı için yineleme durdu.
Görüşmeci “Eve, Ben'in kaç düzey altında bulunuyor?” diye sorarsa, depth sütunu yanıtı doğrudan verir: 3 eksi 1, 2 düzey eder.
CEO'ya Doğru Yukarı İlerleme
Ters yöndeki soru da en az bunun kadar yaygındır: “Eve'in CEO'ya kadar uzanan tam komuta zincirini gösterin.” Birleşim yönünü tersine çevirin — yinelemeli üye artık mevcut satırın manager_id değerini izleyerek üst öğeye doğru ilerler.
WITH RECURSIVE chain AS (
SELECT id, name, manager_id, 1 AS lvl
FROM employees WHERE id = 5
UNION ALL
SELECT e.id, e.name, e.manager_id, c.lvl + 1
FROM employees e
JOIN chain c ON e.id = c.manager_id
)
SELECT name, lvl FROM chain ORDER BY lvl;Aşağı ve Yukarı: JOIN Tersine Döner
Aşağı doğru ve yukarı doğru ilerlemek arasındaki tek yapısal fark birleşim koşuludur:
- Aşağı (astları bulma):
e.manager_id = cte.id— yöneticisi elimizdeki satır olan çalışanlarla eşleşir. - Yukarı (yöneticileri bulma):
e.id = cte.manager_id— kimliği mevcut satırımızın yöneticisine karşılık gelen çalışanla eşleşir.
Bu yön değişikliğini açıkça ifade edebilmeniz, görüşmeciler üzerinde olumlu bir izlenim bırakır.
Girintili Ağaç Oluşturma
Özenli bir yanıt, boşlukları tekrarlamak için depth değerini kullanarak çıktıyı girintili bir ağaç biçiminde düzenler. Bu, yalnızca hiyerarşiyi hesaplamakla kalmayıp sonuçları sunabildiğinizi gösterir.
WITH RECURSIVE org AS (
SELECT id, name, 1 AS depth
FROM employees WHERE manager_id IS NULL
UNION ALL
SELECT e.id, e.name, o.depth + 1
FROM employees e JOIN org o ON e.manager_id = o.id
)
SELECT REPEAT(' ', depth - 1) || name AS tree
FROM org
ORDER BY depth;Yolu Biriktirme
CEO'dan her kişiye giden tam güzergâhı göstermek için bir path dizesi taşıyın. Bu, önceki dersteki tekniğin organizasyon şemasına uygulanmış hâlidir.
WITH RECURSIVE org AS (
SELECT id, name, CAST(name AS VARCHAR(500)) AS path
FROM employees WHERE manager_id IS NULL
UNION ALL
SELECT e.id, e.name, o.path || ' / ' || e.name
FROM employees e JOIN org o ON e.manager_id = o.id
)
SELECT name, path FROM org ORDER BY path;Her Yönetici İçin Astları Sayma
Sık sorulan bir devam sorusu şudur: “Her yöneticiye doğrudan veya dolaylı olarak bağlı kaç kişi var?” Her yönetici için yinelemeli alt ağacı kullanın, ardından toplulaştırın. Yaygın bir yaklaşım, yinelemeyi her kök için bir kez çalıştırmak ve başlangıç yöneticisine göre GROUP BY uygulamaktır.
Burada tüm ağacı dolaşıp kökün altındaki satırları sayarak Ada'nın (CEO) altındaki tüm dolaylı astları sayıyoruz.
WITH RECURSIVE org AS (
SELECT id, name, manager_id, 0 AS depth
FROM employees WHERE id = 1
UNION ALL
SELECT e.id, e.name, e.manager_id, o.depth + 1
FROM employees e JOIN org o ON e.manager_id = o.id
)
SELECT COUNT(*) - 1 AS total_reports FROM org;Yaygın Hatalar
Görüşmecilerin hazırladığı şu tuzaklara dikkat edin:
- Yanlış birleşim yönü — yukarı doğru ilerlemek istediğiniz hâlde
e.manager_id = cte.idkullanmak yanlış kümeyi döndürür. - Başlangıç filtresini unutmak —
WHERE id = Xkoşulunu çıkarırsanız her satırı başlangıç olarak alır ve tüm ormanı döndürürsünüz. - Bir eksik veya fazla derinlik — başlangıç satırının 0 mı yoksa 1 mi olduğunu belirleyin ve tutarlı kalın.
Neden Yalnızca Kendisiyle Birleşim Kullanmayalım
Kendisiyle birleşim, sabit sayıda düzeyi getirebilir: doğrudan astlar için bir birleşim, ikinci düzey astlar için iki birleşim ve bu şekilde devam eder. Ancak derinliği önceden bilmeniz ve her düzey için ayrı bir birleşim yazmanız gerekir.
Yinelemeli bir CTE, tek bir sorguda belirsiz ve herhangi bir derinlikteki yapıyı ele alır. Görüşmeci “hiyerarşi herhangi bir sayıda düzey içerebilir” dediğinde, bu sıradan kendisiyle birleşimleri eler ve yinelemeyi işaret eder.
Hızlı Kontrol
Dolaşım yönünü tersine çevirebildiğinizden emin olun.
Özet
Organizasyon şeması üzerinde gezinme, kendisine başvuran bir tabloya uygulanan özyinelemeli iskelettir:
- Aşağı: bir yöneticiyi başlangıç olarak belirleyin,
e.manager_id = cte.idile birleştirin. - Yukarı: bir çalışanı başlangıç olarak belirleyin,
e.id = cte.manager_idile birleştirin. - Girintileme için
depth, zincirin tamamı içinpathdeğerini taşıyın. - Özyineleme, bir kendisiyle birleştirmenin yapamayacağı şekilde bilinmeyen her derinliği ele alır.
Sırada: sayı ve tarih dizileri oluşturmak için özyineleme kullanımı.
Sıkça Sorulan Sorular
“Kuruluş Şemasını Dolaşma” dersi ücretsiz mi?
Evet — “Kuruluş Şemasını Dolaşma” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve SQL Interview Prep kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. SQL Interview Prep kursu toplamda 4 dersten oluşur.
“Kuruluş Şemasını Dolaşma” dersinde ne öğreneceğim?
Bir çalışan-yönetici hiyerarşisini istenen derinliğe kadar izleyin. SQL Interview Prep ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
SQL Interview Prep öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te SQL Interview Prep, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.
“Kuruluş Şemasını Dolaşma” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu SQL Interview Prep dersinde kod yazıp çalıştırabilir miyim?
Evet. Her SQL Interview Prep dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Çapa ve Özyinelemeli Üyeler
- Kuruluş Şemasını Dolaşma
- Sayı ve Tarih Serileri Oluşturma
- Sonsuz Özyinelemeden Kaçınma