1

Konu: bulamadığım sorgu ?

ParentTable                  ChildTable
ID  Ad          Soyad     ID  Harno   Pozisyon
-------------------     --------------------
1    Ali           Cengiz    1    2         Poz(1/2)
2    Veli          Uyar      1    1         Poz(1/1)
3    Mahmut   Derya     1    3         Poz(1/3)
                                  2    1         Poz(2/1)
                                  2    2         Poz(2/2)
                                  3    1         Poz(3/1)
                                  3    4         Poz(3/4)
                                  3    2         Poz(3/2)
                                  3    3         Poz(3/3)

yukarıdaki iki tablodan aşağıdaki raporu nasıl bir sorguyla çekerim.

ID  Ad          Soyad     Harno   Pozisyon
------------------------------------------
1    Ali          Cengiz       3         Poz(1/3)
2    Veli        Uyar          2         Poz(2/2)
3    Mahmut  Derya        4         Poz(3/4)

2

Re: bulamadığım sorgu ?

CREATE TABLE tbl_parent (id N(2), ad C(10), soyad c(10))
INSERT INTO tbl_parent (id, ad, soyad) VALUES (1,"Ali","Cengiz")
INSERT INTO tbl_parent (id, ad, soyad) VALUES (2,"Veli","Uyar")
INSERT INTO tbl_parent (id, ad, soyad) VALUES (3,"Mahmut","Derya")
INDEX on id TAG id

CREATE TABLE tbl_child (id N(2), HarNo N(2), Pozisyon c(10))
INSERT INTO tbl_child (id, harNo, Pozisyon) VALUES (1,2,"Poz(1/2)")
INSERT INTO tbl_child (id, harNo, Pozisyon) VALUES (1,1,"Poz(1/1)")
INSERT INTO tbl_child (id, harNo, Pozisyon) VALUES (1,3,"Poz(1/3)")
INSERT INTO tbl_child (id, harNo, Pozisyon) VALUES (2,1,"Poz(2/1)")
INSERT INTO tbl_child (id, harNo, Pozisyon) VALUES (2,2,"Poz(2/2)")
INSERT INTO tbl_child (id, harNo, Pozisyon) VALUES (3,1,"Poz(3/1)")
INSERT INTO tbl_child (id, harNo, Pozisyon) VALUES (3,4,"Poz(3/4)")
INSERT INTO tbl_child (id, harNo, Pozisyon) VALUES (3,2,"Poz(3/2)")
INSERT INTO tbl_child (id, harNo, Pozisyon) VALUES (3,3,"Poz(3/3)")
INDEX on STR(id) + STR(HarNo) TAG Idx1

SET RELATION TO id INTO tbl_parent
=Listele()

PROCEDURE Listele
   
    LOCAL lId
    GO TOP IN tbl_child
   
    CLEAR

    lId = id
    DO WHILE NOT EOF()
        SKIP
        IF lId <> id
            SKIP - 1
            ?tbl_parent.ad
            ??"  "
            ??tbl_parent.soyad
            ??"  "
            ??Pozisyon   
            SKIP
            lId = id
        ENDIF
    ENDDO
ENDPROC

3 Son düzenleyen, altun (09.10.2006 14:26:45)

Re: bulamadığım sorgu ?

Visual Fox Pro
select A.id, A.ad, max(B.harno) harno, max(B.Pozisyon) Pozisyon;

from ParentTable A, ChildTable B ;
group by A.id, A.Ad  ;
where A.id=B.id


Uyarı : Sorgu içerinde harno değerinin her bir kullanıcı için max olduğu garanti altında olduğu için problem yok. Ama istenilen pozisyon değeri harno bağlı isteniyor bun nedenle yukarıdaki sorgu doğru sonucu getirse bile (istenilen pozisyon değerleri max pozisyon değerlerlerine tevafuken eşit olduğu için) her zaman doğru getirmeyebilir.

Bunu sağlamanın yolu, sorgu esnasında harno ve posizyon bilgilerini içeren yeni bir field oluşturup bunu kullanmak olacaktır. Gerekirse bunun nasıl yapılabileceği açıklamaya çalışırım.

4

Re: bulamadığım sorgu ?

Erdal,
Bu foxforumda verdigim cevap. Yuri'nin notunu oku:

Visual Fox Pro
select pt.id, ad, soyad, harno, pozisyon ;

from parentTable pt ;
inner join childTable ct ;
on pt.id = ct.id ;
where  ct.harno = (select max(harno) from childTable ct2 where ct.id = ct2.id) ;
order by 1