Alt sorguda sorgulanan kaydin olmamasi durumunda alinan hata

Firebird ve Interbase veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
Burhan_ast
Üye
Mesajlar: 143
Kayıt: 15 Haz 2003 08:33
Konum: Almaty, Kazakhstan

Alt sorguda sorgulanan kaydin olmamasi durumunda alinan hata

Mesaj gönderen Burhan_ast »

Arkadaslar merhaba,

MS-Sql serverda su sekilde bir sorgum var ama sorgulanan alt kayit olmayinca hata aliyorum,

Select LOGICALREF as Kayit_no,
CODE As Stok_kodu,
NAME as Aciklama,
(Select NAME_RU From Lbs_db.Dbo.ITEMS_RU Where ((CODE_NEW=Stk_kart.CODE))) As Aciklama_ru,
(Select PRICE From Lbs_db.Dbo.LG_900_PRCLIST Where ((CARDREF=Stk_kart.LOGICALREF) And (CLSPECODE='Perakende'))) As Fiyat,
(Select DEFINITION_ From Lbs_db.Dbo.LG_900_SPECODES Where ((SPECODETYPE=1) And (SPECODE=Stk_kart.SPECODE))) As Malin_cinsi,
ISNULL ((Select Sum(AMOUNT) From LBS_DB.DBO.LG_900_01_STLINE Where ((TRCODE in (1,2,3,13,14,25,50))) And (STOCKREF=Stk_kart.LOGICALREF) And (CANCELLED=0) AND ((SOURCEINDEX=0) AND (IOCODE IN(1,2)))),0) - ISNULL ((Select SUM(AMOUNT) From LBS_DB.DBO.LG_900_01_STLINE WHERE ((TRCODE in (6,7,8,11,12,25,51))) And (STOCKREF=Stk_kart.LOGICALREF) And (CANCELLED=0) And ((SOURCEINDEX=0) And (IOCODE IN(3,4)))),0) As Kalan
From Lbs_db.Dbo.LG_900_ITEMS as Stk_kart
Where (ISNULL ((Select Sum(AMOUNT) From LBS_DB.DBO.LG_900_01_STLINE Where ((TRCODE in (1,2,3,13,14,25,50))) And (STOCKREF=Stk_kart.LOGICALREF) And (CANCELLED=0) AND ((SOURCEINDEX=0) AND (IOCODE IN(1,2)))),0) - ISNULL ((Select SUM(AMOUNT) From LBS_DB.DBO.LG_900_01_STLINE WHERE ((TRCODE in (6,7,8,11,12,25,51))) And (STOCKREF=Stk_kart.LOGICALREF) And (CANCELLED=0) And ((SOURCEINDEX=0) And (IOCODE IN(3,4)))),0) > 0)
Order By Code



Bu sorgulamada

(Select PRICE From Lbs_db.Dbo.LG_900_PRCLIST Where ((CARDREF=Stk_kart.LOGICALREF) And (CLSPECODE='Perakende'))) As Fiyat,

Satiri ile stok kartina ait Perakende tipli satis fiyatini stok karti ile beraber goruntulemek icin sorgulama yapiyorum ama malesef ornegin XXX kodlu malin satis fiyati sistemde yani o karta ait hic satis fiyati yok ise hata aliyorum hata ise sudur,

Server: 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.


Bu satiri kaldirip calisitirinca problem yok ve ayrica tum kartlarda fiyat oluncada problem yok problem dedigim gibi alt sorgudan kayit donmedigi icin veya alt sorguda 1 taneden fazla kayit olduunda oluyor bu durumda ne yapmam lazim

Burhan Cakmak
Burhan_ast
Üye
Mesajlar: 143
Kayıt: 15 Haz 2003 08:33
Konum: Almaty, Kazakhstan

Mesaj gönderen Burhan_ast »

Arkadaslar hatanin tam kaynagi

(Select PRICE From Lbs_db.Dbo.LG_900_PRCLIST Where ((CARDREF=Stk_kart.LOGICALREF) And (CLSPECODE='Perakende'))) As Fiyat,

Satirindan donen kayit sayisi 2 veya daha fazla bu nedenle problem veriyor ilgili stok kartini bulup 2 tane olan fiyati 1 taneye dusurunce problem kalkiyor ama bu sekilde cok problem var benim yapmam gereken bu gelen kayitlardan herhangi birisini secip almam lazim

burhan
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

kullandiginiz subquery'nin yeri geregi tek kayit donmesi gerekmekte ve sizin de tespit ettiginiz gibi ve zaten mesajda da aynen soyledigi gibi birden fazla kayit donmekte.

Burada eger tek kayit donmuyorsa ya sorgu tasariminda bir mantik hatası olabilir ya da dediginiz gibi bu kayıtlardan herhangi birini almanız isinizi goruyorsa o zaman max veya min foknsiyonlarından birini kullanabilirsiniz.

Kod: Tümünü seç

(Select max(PRICE) From Lbs_db.Dbo.LG_900_PRCLIST Where ((CARDREF=Stk_kart.LOGICALREF) And (CLSPECODE='Perakende'))) As Fiyat, 

Ya da sorgu sonucundan sadece ilk kaydı almanızı saglayacak olan Sybase ASA icin first veya top 1 komutlarını kullanabilirsiniz. Bunların MsSQL 'de tam olarak nasıl kullanıldıklarından emin degilim. Gerci Sybase ASA helpinde Select Statement'in SQL/92 ve SQL/99 standardina uygun oldugu yaziyor ama denemek lazim.

Kod: Tümünü seç

(Select Top 1 PRICE From Lbs_db.Dbo.LG_900_PRCLIST Where ((CARDREF=Stk_kart.LOGICALREF) And (CLSPECODE='Perakende'))) As Fiyat, 
ya da

Kod: Tümünü seç

(Select First PRICE From Lbs_db.Dbo.LG_900_PRCLIST Where ((CARDREF=Stk_kart.LOGICALREF) And (CLSPECODE='Perakende'))) As Fiyat, 
Burhan_ast
Üye
Mesajlar: 143
Kayıt: 15 Haz 2003 08:33
Konum: Almaty, Kazakhstan

Mesaj gönderen Burhan_ast »

(Select Top 1 PRICE From Lbs_db.Dbo.LG_900_PRCLIST Where ((CARDREF=Stk_kart.LOGICALREF) And (CLSPECODE='Perakende'))) As Fiyat,


Seklinde calisti tsk,

burhan Cakmak
Cevapla