Soru
Önce netleştir
Kod yazmadan önce sorulacak sorular. Her biri farklı bir sorguya götürür; sormamak en sık puan kaybıdır.
- Yöneticisi olmayan (en üstteki) çalışan sonuçta görünmeli mi?
- Ürün çiftinde (A, B) ile (B, A) aynı çift mi?
- Aynı siparişte aynı ürün iki satırda olabilir mi?
- Kaç çift isteniyor; eşitlikte ne olsun?
Yaklaşım
- Tabloyu iki takma adla birleştir; her takma ad bir rolü temsil eder (çalışan, yönetici).
- Çiftlerde tekrarı önlemek için a.id < b.id koşulu ekle.
- Önce sipariş × ürün düzeyinde tekilleştir, sonra çiftleri üret ve say.
Çözüm 1: yöneticiden fazla kazananlar
SELECT e.first_name AS calisan, e.salary, m.first_name AS yonetici, m.salary AS yonetici_maas FROM employees e JOIN employees m ON m.emp_id = e.manager_id WHERE e.salary > m.salary ORDER BY e.salary DESC;
Çözüm 2: birlikte satın alınan ürün çiftleri
WITH s AS ( SELECT DISTINCT order_id, product_id FROM order_items ) SELECT a.product_id AS urun_a, b.product_id AS urun_b, COUNT(*) AS birlikte FROM s a JOIN s b ON b.order_id = a.order_id AND a.product_id < b.product_id GROUP BY a.product_id, b.product_id ORDER BY birlikte DESC, urun_a, urun_b LIMIT 5;
İkisi de aynı fikir: bir tabloyu iki farklı rolde kullanmak. Anadolu Market'te birinci sorgu boş döner, çünkü kimse yöneticisinden fazla kazanmıyor; boş sonuç da geçerli bir cevaptır, bunu görüşmeciye söyleyip sorgunun doğru çalıştığını >= ya da oranla gösterebilirsin. İkinci sorguda a.product_id < b.product_id hem bir ürünün kendisiyle eşleşmesini hem de (A, B) / (B, A) çift sayımını önler. Ürün sayısı büyüdükçe çift sayısı karesel büyür; büyük veride önce popüler ürünlerle sınırlamak gerekir.
Sınır durumları
| Durum | Ne olur? |
|---|---|
| Yöneticisi olmayan | INNER JOIN onu düşürür; istenirse LEFT JOIN |
| Eşit maaş | > yerine >= kullanılırsa sonuç değişir; soruyu netleştir |
| Aynı ürün iki satırda | DISTINCT olmazsa çift sayısı şişer |
| Kendisiyle eşleşme | a.id < b.id ya da a.id <> b.id koşulu gerekir |
Takip soruları
- Çiftin “kaldıraç” (lift) değerini nasıl hesaplarsın?
- Yönetim zinciri çok seviyeliyse (yöneticinin yöneticisi) ne kullanırsın? (özyinelemeli CTE)
- Bu sorgu 10 milyon sipariş satırında nasıl hızlandırılır?