SQL Server ‘Subquery Returned More Than 1 Value’ 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ı

SQL Server 'Subquery Returned More Than 1 Value' 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.

Hatanın tam hali

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

Sonuç

OrderIDCustomerIDSalespersonPersonIDPickedByPersonIDContactPersonIDBackorderOrderIDOrderDateExpectedDeliveryDateCustomerPurchaseOrderNumberIsUndersupplyBackorderedCommentsDeliveryInstructionsInternalCommentsPickingCompletedWhenLastEditedByLastEditedWhen
18322NULL3032451/1/20131/2/2013121261NULLNULLNULL00:00.0700:00.0

Ü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

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ü.

PersonIDFullNamePreferredNameSearchNameIsPermittedToLogonLogonNameIsExternalLogonProviderHashedPasswordIsSystemUserIsEmployeeIsSalespersonUserPreferencesPhoneNumberFaxNumberEmailAddressPhotoCustomFieldsOtherLanguagesLastEditedByValidFromValidTo
1033Adam KubatAdamAdam Adam Kubat0NO LOGON1/0/1900NULL000NULL(216) 555-0100(216) 555-0101adam@tailspintoys.comNULLNULLNULL100:00.0########
1221Adam DvorakAdamAdam Adam Dvorak0NO LOGON0NULL000NULL(239) 555-0100(239) 555-0101adam@tailspintoys.comNULLNULLNULL100:00.0########
2094Adam BalazAdamAdam Adam Balaz0NO LOGON0NULL000NULL(319) 555-0100(319) 555-0101adam@wingtiptoys.comNULLNULLNULL100:00.0########

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.

Bunlar da hoşunuza gidebilir...

8 Cevaplar

  1. Huseyin dedi ki:

    Teşekkurler

  2. unknownartistim dedi ki:

    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)

    • Murat ÖNER dedi ki:

      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.

  3. Cüneyt dedi ki:

    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.

    • Murat ÖNER dedi ki:

      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.

  4. MEHMET dedi ki:

    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

Bir Cevap Yazın