‘Subquery Returned More Than 1 Value’ Sql Server Hatası, yazdığınız sql cümlelerinde yeri geldiğinde subquery ile veri alma ihtiyacı duyabiliyorsunuz 1 kayıt gelmesi gereken durumlarda 1’den fazla kayıt geldiğinde bu hatayı vermesi olası bir durumdur.
SQL Server ‘Subquery Returned More Than 1 Value’ Hatası Çözümü
Yazdığınız sql cümlelerinde yeri geldiğinde subquery ile veri alma ihtiyacı duyabiliyorsunuz 1 kayıt gelmesi gereken durumlarda 1’den fazla kayıt geldiğinde bu hatayı vermesi olası bir durumdur.
Hata Çıktısı
1 | SqlException: Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression. |
Bu hatanın çözümü için ise hatanın devamında da belirtildiği gibi koşullar ekleyerek tek kayıt gelmesini sağlayınız veya koşul varsa 1’e düşürebilmek için koşul sayısını arttırmalı, koşul için kullandığınız alan adını daha doğru seçmeli yada .
Alttaki örnek kod tablo üzerinden ve örnek sql kod blokları ile nasıl bu hataya ulaştığımızı göreceğiz ve hatayı çözmek için kullanacağımız yollarıda kullanacağız.
Alttaki sorgular Northwind örnek veritabanı kullanılarak oluşturulmuş sorgulardır. Bu olayı anlamada yardımcı olması adına oluşturulmuş sql cümleleridir.
Örnek 1
1 | SELECT * FROM Sales.Orders o WHERE o.OrderID = ( SELECT o2.OrderID FROM Sales.Orders o2 WHERE o2.OrderID = 1 ) |
Sonuç
OrderID | CustomerID | ContactPersonID | BackorderOrderID | OrderDate | ExpectedDeliveryDate | CustomerPurchaseOrderNumber | LastEditedBy |
1 | 832 | 3032 | 45 | 1/1/2013 | 1/2/2013 | 12126 | 7 |
Üstteki kodda belki bu hatayı hiç almayacaksınız nedeni de suquery sql sorgumuzda where’de koşul olarak primary key bir alan kullandık o yüzden hiçbir şekilde birden fazla kayıt gelme durumu olmayacaktır ama primary key yerine alttaki gibi bir nvarchar kolonu olan bir kolon kullansaydık o zaman bu hata ile karşılaşmamız olası bir durumdur.
Örnek 2
1 | SELECT * FROM Application.People p1 WHERE p1.PreferredName = (SELECT p2.PreferredName FROM Application.People p2 WHERE p2.PreferredName = 'Adam') |
Buradaki sorgu neden böyle yazıldı where de direkt adam yazsaydın neden subquery ile uğraşıyorsun gibi düşünmeyelim ben sadece subquery hatasını en kısa yoldan nasıl alırım derken bu sorgu çıktı ortaya ama sonuç itibariyle hatayı aldım subquery sonucunda tüm alanları alacak şekilde SELECT * FROM Application.People p2 WHERE p2.PreferredName = ‘Adam’ revize edince alttaki veri kümesi döndü.
PersonID | FullName | PreferredName | SearchName | IsExternalLogonProvider | PhoneNumber | FaxNumber | EmailAddress |
1033 | Adam Kubat | Adam | Adam Adam Kubat | 1/0/1900 | (216) 555-0100 | (216) 555-0101 | adam@tailspintoys.com |
1221 | Adam Dvorak | Adam | Adam Adam Dvorak | 0 | (239) 555-0100 | (239) 555-0101 | adam@tailspintoys.com |
2094 | Adam Balaz | Adam | Adam Adam Balaz | 0 | (319) 555-0100 | (319) 555-0101 | adam@wingtiptoys.com |
Gördüğünüz gibi 3 farklı satır döndü bundan dolayı hatayı aldık bu sorunu aşmak için şu şekilde yöntemler kullanabilirsiniz subqyery sorgusuna TOP 1 ekleyerek sadece tek bir kaydın gelmesini sağlayabilirsiniz fakat aslında odaklanmanız gereken konu farklı gelen datalar varsa bir düşünmek lazım gerçekten erişmeye çalıştığım data TOP 1 dediğimde doğru data olacak mı? Eğer subquery sonucunda dönen tüm satırlardaki dataların aynı olacağını düşünüyorsanız(PreferredName olarak seçtiğim kolonda olduğu gibi) o zaman rahatlıkla TOP 1 diyerek bu sorunu aşabilirsiniz yada sayısal olarak en büyük yada en küçük değerlerle ilgileniyorsanız o zaman TOP 1 yerine MAX ve MIN gibi aggregate fonksiyonlarını kullanabilirsiniz.
📚 İlgilenebileceğiniz Diğer Bazı Kaynaklar
- SQL Server Üzerinden Windows Servisleri Yönetmek
- Sql Server COALESCE İfadesi Kullanımı
- SQL Server “Cannot open user default database” hatası çözümü
✍ Lütfen “Subquery Returned More Than 1” Sql Server hatasına ait çözüm makalesi için alakalı olumlu-olumsuz tüm görüşlerinizi bana yorum yada mail yolu ile iletmeyi ihmal etmeyin.
🔗 Sosyal medya kanallarından {subject} adlı makaleyi paylaşarak destek olursanız çok sevinirim.
👋 Bir sonraki makalede görüşmek dileğiyle.
MERHABALAR;
Msg 512, Level 16, State 1, Line 1
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
Aşagıdaki kodu çalıştırırken bu hatayı alıyorum.
SELECT TBLBIRIMLEREX.BARCODE, STK.STOKKODU
, STK.MALINCINSI I,KTR.TIPACIKLAMA,
CAST(TBLBIRIMLEREX.SATISFIYATI1 AS NUMERIC(10, 2)) AS SATISFIYATI,
(SELECT CAST(CARPAN AS NUMERIC(10,0))
FROM F0101TBLBIRIMLEREX WHERE STOKNO = STK.IND AND
BIRIMADI = ‘KOLİ’) AS CARPAN, STK.KOD1,
STK.KOD2, STK.KOD3, STK.KOD4, STK.KOD5,STK.KOD6, STK.KOD7,
STK.KOD8, STK.KOD9, STK.KOD10
,CAST((SELECT ISNULL(SUM(ENVANTER), 0) FROM F0101D0001TBLDEPOENVANTER
WHERE STOKNO = A.STOKNO AND DEPO = 100 AND TARIH
BETWEEN ‘2018-01-01’ AND ‘2018-04-06’) AS NUMERIC(10, 2))
AS DEPOENVANTERI FROM F0101TBLSTOKLAR AS STK LEFT
JOIN F0101D0001TBLDEPOENVANTER AS A ON STK.IND = A.STOKNO LEFT
JOIN F0101TBLDEPOLAR AS TBLDEPOLAR ON TBLDEPOLAR.IND = A.DEPO LEFT
JOIN F0101TBLBIRIMLEREX AS TBLBIRIMLEREX ON STK.BIRIMEX = TBLBIRIMLEREX.IND
LEFT JOIN KTRSTOKTIP AS KTR ON STK.STOKTIPI = KTR.KOD Where STK.IND >= 100 AND
STK.STOKTIPI IN (0,19) AND STK.STATUS = 1 AND
(STK.MALINCINSI like ‘%%’ OR STOKKODU LIKE ‘%%’) AND 1 = 1GROUP BY TBLBIRIMLEREX.BARCODE,STK.IND,TBLBIRIMLEREX.STOKNO,TBLBIRIMLEREX.CARPAN,
TBLBIRIMLEREX.BIRIMADI, STK.STOKKODU,STK.MALINCINSI, A.STOKNO, KTR.TIPACIKLAMA,
TBLBIRIMLEREX.SATISFIYATI1,STK.KOD1, STK.KOD2, STK.KOD3,
STK.KOD4, STK.KOD5, STK.KOD6, STK.KOD7, STK.KOD8, STK.KOD9, STK.KOD10
Hata yine aynı 1’den fazla kayıt geldiği için patlıyor subquery’den tek kayıt gelecek şekilde sorguyu düzenleyin sorun düzelecektir.
Merhabalar,
Aşağıdaki sql kodunda subquery hatası alıyorum. Yarımcı olursanın çok sevinirim.
F0105TBLCARI tablosundan firma adını çekmek istediğimde bu hata çıkıyor karşıma.
Merhaba,
Aldığınız hatayı tam olarak anlayabilmek için ilgili hatayı yazarmısınız yada en iyisi dummy datalı bir şekilde sorgunuzu sqlfiddle.com adresinden çalıştırıp kodunuzun ve datanızın yer aldığı örneği bizimle paylaşırmısınız.
ama bilinçli olarak böyle olsun istiyorum, mesela x tablosundaki ID leri group By yaparak Y tablosuna isimlerini çekme gerekip yani select isim from Y where ID=(X tablosundaki 1 den fazla ID için)
ID = Yerine ID IN (X tablosundaki 1 den fazla ID icin) kullanirsaniz boylelikle subquery den 1 den fazla sonuc donsede istediginiz sonuc baska bir hata yoksa gelecektir.
Teşekkurler
Yorumunuz için ben teşekkür ederim.