ORA-01427: single-row subquery returns more than one row
Tek bir değer beklenen yerde — =, <, > sonrasında ya da SELECT listesinde — kullanılan bir alt sorgu birden fazla satır döndürdü. IN ya da EXISTS kullanın, alt sorguyu bir toplama fonksiyonuyla toplayın ya da tek satır döndürmesini sağlayın.
Ne anlama gelir?
Skaler bir alt sorgu tek bir değerin yerini tutar. Dış sorgunun herhangi bir satırı için iki ya da daha fazla satır döndürürse Oracle birini seçemez ve ORA-01427 ile durur. İfade bazı verilerle çalışıp bazılarıyla patlayabilir; bu da hatanın rastgele gibi görünmesine yol açar.
Yaygın nedenler
- Tekil anahtar üzerinde olmayan bir alt sorguyla
=karşılaştırması. - SELECT listesindeki ilişkili (correlated) bir alt sorguda ilişkinin bir kısmının eksik olması.
- Bir arama (lookup) tablosundaki kopya satırlar.
- Alt sorgunun birden fazla satırla eşleştiği bir UPDATE … SET kolon = (alt sorgu).
Nasıl çözülür?
- Birkaç değerden herhangi biri uygunsa
=yerineINya daEXISTSkullanın. - Tek bir değer gerekiyorsa toplayın (
MAX,MIN) ya da ORDER BY ile birlikteFETCH FIRST 1 ROW ONLYkullanın. - İlişkiyi tamamlayın ki alt sorgu her dış satır için tekil olsun.
- Kopyaları bulun:
GROUP BY anahtar HAVING COUNT(*) > 1.
Örnek
= yerine IN kullanın:
-- Bir departmanın birden fazla yöneticisi varsa ORA-01427
SELECT * FROM employees
WHERE manager_id = (SELECT id FROM managers WHERE dept_id = 10);
SELECT * FROM employees
WHERE manager_id IN (SELECT id FROM managers WHERE dept_id = 10);
SQLlightspeed’de
Bir ifade hata verdiğinde SQLlightspeed’in hata paneli, hata kodunu sade bir Türkçe açıklama ve ne yapmanız gerektiğine dair bir öneriyle; Oracle’ın kendi mesajı ve Oracle dokümantasyonuna bağlantıyla birlikte gösterir — bu hata ve sık görülen onlarca başka hata için.
İlgili hatalar
ORA-01422ORA-01403ORA-00936 Tüm Oracle hataları →
Oracle dokümantasyonu: ORA-01427. Oracle, Oracle Corporation’ın tescilli ticari markasıdır. SQLlightspeed’in Oracle ile bir bağlantısı yoktur.