Delphi Can
SQL Sorgusundan dönen bilgilileri tekrar alma? - Baskı Önizleme

+- Delphi Can (https://www.delphican.com)
+-- Forum: Veri Tabanı (https://www.delphican.com/forumdisplay.php?fid=4)
+--- Forum: MS SQL Server (https://www.delphican.com/forumdisplay.php?fid=103)
+--- Konu Başlığı: SQL Sorgusundan dönen bilgilileri tekrar alma? (/showthread.php?tid=7173)

Sayfalar: 1 2


SQL Sorgusundan dönen bilgilileri tekrar alma? - m_ekici - 27-01-2023

Merhaba
MS SQL den malzeme listesini (60 bin kayıt içinden) filtreleyerek çekiyorum. Gelmesi 3-4 sn. sürüyor. Gelen bu liste içerisindeki MARKA ları (tek olarak) almam lazım. Bu işlem için aynı queryi yi (Marka alacak şekilde) tekrar gönderiyorum. Bu da toplamda sonucun 7-8 sn. de dönmesine neden oluyor. 
İlk QUERY ile gelen sonuç içerinden MARKA ları almak veya farklı bir yöntem var mı?

İyi Çalışmalar


SQL Sorgusundan dönen bilgilileri tekrar alma? - yhackup - 27-01-2023

sadece marka adı lazımsa "Group by Marka" olarak çağırmayı denediniz mi ?


SQL Sorgusundan dönen bilgilileri tekrar alma? - COMMANDX - 27-01-2023

SQL Sorgusunda Or yapısı kullanarak Arayacağınız Markaları önce bir memoya aktarıp oradan OR ile birleştirip çoklu listeleme yapmak

VAR
I:INTEGER;
begin
         DM.uniquery.Close;
           DM.uniquery.SQL.Clear;
           DM.uniquery.SQL.Add('SELECT * FROM tablo WHERE ');
             FOR I := 0 TO MEMO1.Lines.Count-1 DO BEGIN
               DM.uniquery.SQL.Add(' MARKALAR = '+QUOTEDSTR(MEMO1.Lines.Strings[I])+' OR ');
             END;
            DM.uniquery.SQL.Add(' MARKALAR = '+QUOTEDSTR(MEMO1.Lines.Strings[0]) );
            DM.uniquery.SQL.Add(' ORDER BY MARKALAR ASC ');
          // MEMO1.Text:=DM.UNIQUERY.SQL.Text;
            DM.uniquery.Open;
       END;


Şöyle birşey olması gerek


SQL Sorgusundan dönen bilgilileri tekrar alma? - m_ekici - 27-01-2023

Teşekkürler
SQL yazmada veya çağırmada problemim yok.
İlk gönderdiğim Query den gelen sonucu Cache de tekrar zaman kaybetmeden çağırma yöntemi gibi bir şey var mı onu merak ediyorum.
30 bin sonuç döndüğünde tek tek memoya aktarmak daha uzun sürer.


Cvp: SQL Sorgusundan dönen bilgilileri tekrar alma? - hi_selamlar - 27-01-2023

(27-01-2023, Saat: 16:53)m_ekici Adlı Kullanıcıdan Alıntı: Teşekkürler
SQL yazmada veya çağırmada problemim yok.
İlk gönderdiğim Query den gelen sonucu Cache de tekrar zaman kaybetmeden çağırma yöntemi gibi bir şey var mı onu merak ediyorum.
30 bin sonuç döndüğünde tek tek memoya aktarmak daha uzun sürer.

Merhabalar,

WITH CTE AS özelliğini kullanabilirsiniz. (common_table_expression)


WITH ilkSorgum
AS
(
  SELECT Marka.ID, Marka.MarkaAdi FROM Markalar as Marka
)
SELECT DISTINCT MarkaAdi as MarkaAdi
FROM ilkSorgum

veya

WITH ilkSorgum
AS
(
  SELECT Marka.ID, Marka.MarkaAdi FROM Markalar as Marka
)
SELECT Count(MarkaAdi) as MarkaSayisi, MarkaAdi 
FROM ilkSorgum
GROUP BY MarkaAdi

ÖRNEK > https://dbfiddle.uk/xlS9FY-l

Kolay gelsin.


Cvp: SQL Sorgusundan dönen bilgilileri tekrar alma? - csunguray - 28-01-2023

(27-01-2023, Saat: 14:49)m_ekici Adlı Kullanıcıdan Alıntı: Merhaba
MS SQL den malzeme listesini (60 bin kayıt içinden) filtreleyerek çekiyorum. Gelmesi 3-4 sn. sürüyor. Gelen bu liste içerisindeki MARKA ları (tek olarak) almam lazım. Bu işlem için aynı queryi yi (Marka alacak şekilde) tekrar gönderiyorum. Bu da toplamda sonucun 7-8 sn. de dönmesine neden oluyor. 
İlk QUERY ile gelen sonuç içerinden MARKA ları almak veya farklı bir yöntem var mı?

İyi Çalışmalar

Geçici TABLE kullanabilirsiniz.

Geçici tablo oluşturma:
SELECT tbl_malzeme.* 
INTO #GeciciTablo
FROM tbl_malzeme
WHERE tbl_malzeme.adi like 'a%'

Ürünleri çekme:
SELECT * from #GeciciTablo

Markaları çekme:
SELECT marka from #GeciciTablo group by marka


İş bitince:
DROP TABLE #GeciciTablo



Geçici tablolar hakkında:
https://www.sqlservertutorial.net/sql-server-basics/sql-server-temporary-tables/


Cvp: SQL Sorgusundan dönen bilgilileri tekrar alma? - bydelphi - 28-01-2023

(27-01-2023, Saat: 14:49)m_ekici Adlı Kullanıcıdan Alıntı: Merhaba
MS SQL den malzeme listesini (60 bin kayıt içinden) filtreleyerek çekiyorum. Gelmesi 3-4 sn. sürüyor. Gelen bu liste içerisindeki MARKA ları (tek olarak) almam lazım. Bu işlem için aynı queryi yi (Marka alacak şekilde) tekrar gönderiyorum. Bu da toplamda sonucun 7-8 sn. de dönmesine neden oluyor. 
İlk QUERY ile gelen sonuç içerinden MARKA ları almak veya farklı bir yöntem var mı?

İyi Çalışmalar


Belkide sorunu çözdün ama yine de farklı bir alternatif paylaşayım, şurada dursun.
iki kere sunucuya gitme derim, 
tek sorgulama ile Adoquery birden fazla recordset döndürebiliyor aynı mssql server management studio gibi ,
tek sorgulama ile 2 sonuç döndür biri detaylı liste diğer gruplanmış marka listen olsun
sonra her ikisinide recordset olarak ayrı ayrı alıp kullanabilirsin. daha hızlı sonuç alabilirsin.
burada detaylı örnek anlatımı var.
https://theroadtodelphi.com/2010/06/17/returning-multiple-datasets-with-ado-and-delphi/

sql-man-studio-dataset.png?w=820


SQL Sorgusundan dönen bilgilileri tekrar alma? - m_ekici - 29-01-2023

Cevap yazan herkese teşekkür ederim.

1. hi_selamlar
With CTE AS karışık sorguyu daha kullanılır hale getirmek için güzel bir yöntem, fakat 2. isteği gönderemediğim için işimi çözmedi. süre de çok fark etmiyor. (Bu şekilde kullanımı bilmiyordum, aynı Queryi 1. den farzla kullanım için güzel bir yöntem)

2. bydelphi
güzel bi yöntem ama 1. query den dönen sonuçlar içinden gelen bilgileri tekrar sorgulamak istiyorum. aynı sorguyu 2. defa çalıştırdığım için süre aynı oluyor.

3. csunguray ın cevabı işimi çözecek galiba ama sürekli geçici tablo oluşturmanın hafıza yönünden bir sıkıntısı olur mu?


Cvp: SQL Sorgusundan dönen bilgilileri tekrar alma? - csunguray - 29-01-2023

(29-01-2023, Saat: 18:51)m_ekici Adlı Kullanıcıdan Alıntı: 3. csunguray ın cevabı işimi çözecek galiba ama sürekli geçici tablo oluşturmanın hafıza yönünden bir sıkıntısı olur mu?


Geçici tablolar SQL Server'ın tempdb isimli veritabanında depolanır. Eğer çok büyük geçici tablolar oluşturuyorsanız işiniz bittiğinde bunları silmeyi ihmal etmeyin. Aksi takdirde connection'ı sonlandırdığınızda bunlar otomatik silinecektir.


SQL Sorgusundan dönen bilgilileri tekrar alma? - m_ekici - 30-01-2023

#GeciciTablo isminde bir tablo oluşturduğumda tablo aşağıdaki gibi görünüyor. (Ben select i #GeciciTablo olarak kullanabiliyorum)

[dbo].[#GeciciTablo________________________________________________________________________________________________________000000000051]

bu benim yaptığım bir hatadan mı oluşuyor, yoksa SQL mi bu şekilde isimlendiriyor?