MS SQL SORGU(Ana ve Detail Tablo)

MS SQL Server veritabanı ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
Çağrıbey
Üye
Mesajlar: 40
Kayıt: 26 Kas 2004 11:25
Konum: Ankara

MS SQL SORGU(Ana ve Detail Tablo)

Mesaj gönderen Çağrıbey »

Öncelikle, örnekleri incelediğim halde çare bulamadığım için buraya yazıyorum..

Elimde 2 tablo var, Master ve Detail Tablo
her iki tabloyu birbirine TC KİMLİK NO ile bağlıyorum.

ANa Tablo da, TC_KIMLIKNO, ADI,SOYADI

Detail Tablo da ise, TC_KIMLIKNO, GOREV_YERI, UNVANI

alanlar bulunmaktadır.
------------------------
procedure TForm1.GorevYeri1Click(Sender: TObject);
begin
if Edit1.Text ='' Then Edit1.SetFocus;
if Edit1.Text<>'' Then
Begin
AdoQuery1.Close;
AdoQuery2.Close;
AdoQuery1.SQL.Clear;
AdoQuery1.Sql.Add('SELECT * From TABLO1, TABLO2 where Gorev_Yeri = '''+Edit1.Text+''' ');
AdoQuery1.Sql.Add('and TABLO1.Tc_KimlikNo=TABLO2.Tc_KimlikNo ');
AdoQuery1.Open;
//
AdoQuery2.SQL.Clear;
AdoQuery2.Sql.Add('SELECT * FROM TABLO2 where TABLO2.Tc_KimlikNo=:Tc_KimlikNo ');
AdoQuery2.Sql.Add('And Gorev_Yeri = '''+Edit1.Text+''' ');
AdoQuery2.Open;
End;
end;
-----------------------------
Bu sorguyu çalıştırdığım zaman

DBGRID1 de
---------------
TC_KIMLIKNO ADI SOYADI
11111111111 Ali AK
11111111111 Ali AK

Detail TABLO nun bağlı olduğu TBGRID2 de
TC_KIMLIKNO GOREV_YERI UNVANI
11111111111 Ankara Şef
11111111111 İstanbul Sayman

olarak çıkıyor, yani DBGRID2 kayıtları normal getiriyor
Ancak DB GRID1'de aslında tek bir kayıt çıkması lazım, çünkü veritabaninda zaten bir tane.

diğer kayitlar da alt alta bu şekilde Grid1 de mükerrer çıkıyor.

Sorgulamayi nasil yapmaliyiz ki, Detail Tabloda sorgulama yaptigimiz zaman Ana tablonun bağlı olduğu DBGRID1 de tek kayit çıksın.
Gelecek günden ne dilersen, doğacak günler onu getirir
Kullanıcı avatarı
naile
Admin
Mesajlar: 1873
Kayıt: 11 Haz 2003 10:11

Mesaj gönderen naile »

Tablo1 ile tablo2 yi birleştirip çağırmışsın. Tablo2 de o verdiğin örnek kayıt için de 2 kayıt olduğundan her biri için 2 satır dönüyor. Eğer sen 1. gridde sadece Tablo1 deki kimlik no ad ve soyadı çağıracaksan Tablo2 ile birleştirmene gerek yok. Sadece Tablo1 i select etmen yeterli.
Kullanıcı avatarı
m_ekici
Kıdemli Üye
Mesajlar: 563
Kayıt: 11 Haz 2003 06:49
Konum: Adana
İletişim:

Mesaj gönderen m_ekici »

şu şekilde kullanabilirsin;

Kod: Tümünü seç

AdoQuery1.Close; 
AdoQuery2.Close; 
AdoQuery1.SQL.Clear; 
AdoQuery1.Sql.Add('SELECT * From TABLO1 where Gorev_Yeri = '''+Edit1.Text+''' '); 
AdoQuery1.Open; 
// 

AdoQuery2.DataSource := AdoQuery1 e ait datasource; 
AdoQuery2.SQL.Clear; 
AdoQuery2.Sql.Add('SELECT * FROM TABLO2 where TABLO2.Tc_KimlikNo=:Tc_KimlikNo '); 
AdoQuery2.Open; 
yalnız Tc_KimlikNo iki tabloda da aynı şekilde yazılmış ise
TABLO2.Tc_KimlikNo=:Tc_KimlikNo '); satırını
TABLO2.Tc_KimlikNo=:TABLO1.Tc_KimlikNo '); yaz ve görev_yeri
Çağrıbey
Üye
Mesajlar: 40
Kayıt: 26 Kas 2004 11:25
Konum: Ankara

Mesaj gönderen Çağrıbey »

öncelikle ilginiz için teşekkür ederim.
yalnız şöyle bir sorun var.

iki tablodaki ortak alan olan tc_kimlikno ile arama yapmanın bir zorluğu yoktur, yani daha doğrusu, birinci tablodaki alanlar üzerinden arama yapılabiliyor, ve bu birinci tablodan arama yapılıdğında TABLO2 dolayısıyla DBGRID2 de ona göre açılıyor,

sorun şu;
istiyorum ki, TABLO2 deki alanlardan her hangi birisinde arama yapayım, örneğin TABLO2 ye ait olan Gorev_Yerin'ne göre arama yapayım, ve buna göre kayıtlar gelsin, ve TABLO2 de bulunamayan bir kaydin TABLO1 de hiç görüntüsü gelmesin.

Örneğin, görev yeri "ANKARA" değilse, tc_kimlikler eşit olsa bile TABLO1 de aynı tc kimlige ait olan kayıt hiç gelmesin.. oysa sorudaki örnekte te belirttiğim gibi olmasa bile geliyor.
Gelecek günden ne dilersen, doğacak günler onu getirir
Çağrıbey
Üye
Mesajlar: 40
Kayıt: 26 Kas 2004 11:25
Konum: Ankara

Mesaj gönderen Çağrıbey »

Sorunu şu şekilde çözdüm,
lazım olan arkadaşların işine yarar diye buraya yazıyorum...
------
procedure TForm1.Button4Click(Sender: TObject);
begin
if Edit1.Text ='' Then Edit1.SetFocus;
if Edit1.Text<>'' Then
Begin
AdoQuery1.Close;
AdoQuery1.SQL.Clear;
AdoQuery1.SQL.Add('SELECT TABLO1.Tc_KimlikNo, TABLO2.Gorev_Yeri, TABLO1.Adi, TABLO1.Soyadi, TABLO1.Kurum_Sicili, TABLO1.Dogum_Yeri, TABLO1.Dogum_Tarihi');
AdoQuery1.SQL.Add('FROM TABLO1 INNER JOIN TABLO2 ON TABLO1.Tc_KimlikNo = TABLO2.Tc_KimlikNo');
AdoQuery1.SQL.Add('GROUP BY TABLO1.Tc_KimlikNo, TABLO2.Gorev_Yeri, TABLO1.Adi, TABLO1.Soyadi, TABLO1.Kurum_Sicili, TABLO1.Dogum_Yeri, TABLO1.Dogum_Tarihi');
AdoQuery1.SQL.Add('HAVING (TABLO2.Gorev_Yeri = '''+Edit1.Text+''' ) ');
AdoQuery1.Open;
//
AdoQuery2.SQL.Clear;
AdoQuery2.Close;
AdoQuery2.Sql.Add('SELECT * FROM TABLO2 WHERE TABLO2.Tc_KimlikNo=Tc_KimlikNo ');
AdoQuery2.Sql.Add('And Gorev_Yeri = '''+Edit1.Text+''' ');
AdoQuery2.Open;
End;
end;
Gelecek günden ne dilersen, doğacak günler onu getirir
Cevapla