İlişkisiz join

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
Kullanıcı avatarı
Lost Soul
Üye
Mesajlar: 1064
Kayıt: 01 Nis 2007 02:55
Konum: mekan ANKARA toprak ELAZIĞ
İletişim:

İlişkisiz join

Mesaj gönderen Lost Soul »

Aşağıdaki iki örneğin sonucunu verebilecek bir sorgu yapabilir miyiz?
Örnek 1

Kod: Tümünü seç

Tablo1
	Ali
	Veli
	Mehmet
	Ahmet
 
Tablo2
	1
	2
Sonuç
	Ali        1
	Veli       2
	Mehmet     null
	Ahmet      null
Örnek 2

Kod: Tümünü seç

Tablo1
	Ali
	Veli
Tablo2
	1
	2
	3
	4
Sonuç
	Ali     1
	Veli    2
	null    3
	null    4

yani iki tabloyu şartsız şurtsuz ilişkisiz kartezyensiz bir şekilde yanyana koyabilecek bir sorguyu nasıl yapabilirim.
Kullanıcı avatarı
unicorn64
Üye
Mesajlar: 919
Kayıt: 04 Nis 2006 08:56
Konum: yine yeniden Ankara ^_^

Re: İlişkisiz join

Mesaj gönderen unicorn64 »

emin değilim ama...

Kod: Tümünü seç

select * from tablo1,tablo2
şeklinde denediniz mi
bazen yükselmek için önce dibi görmek gerekir...

forumda soru sormadan önce bakılmalı bence
daha fazlası için...

yürümeyi öğrenmeden koşmaya çalışanlar için, tökezleyip düşmek kaçınılmazdır...

Resim
Kullanıcı avatarı
Lost Soul
Üye
Mesajlar: 1064
Kayıt: 01 Nis 2007 02:55
Konum: mekan ANKARA toprak ELAZIĞ
İletişim:

Re: İlişkisiz join

Mesaj gönderen Lost Soul »

cevap için teşekkürler. şimdi denedim full join gibi davranıyor. işime yaramıyor
Kullanıcı avatarı
Lost Soul
Üye
Mesajlar: 1064
Kayıt: 01 Nis 2007 02:55
Konum: mekan ANKARA toprak ELAZIĞ
İletişim:

Re: İlişkisiz join

Mesaj gönderen Lost Soul »

yaklaşık 6 saattir uğraşıyorum en son yazdığım kod şu şekilde:

Çalışma tabloları

Kod: Tümünü seç

CREATE TABLE A (
    A1  INTEGER NOT NULL,
    A3  VARCHAR(10)
);

CREATE TABLE B (
    B1  INTEGER NOT NULL,
    B3  VARCHAR(10)
);

INSERT INTO A (A1, A3)
       VALUES (1, 'Leyla');
INSERT INTO A (A1, A3)
       VALUES (2, 'Şeyma');
INSERT INTO A (A1, A3)
       VALUES (3, 'Zeynep');
INSERT INTO A (A1, A3)
       VALUES (4, 'Rukiye');
INSERT INTO A (A1, A3)
       VALUES (5, 'ÜmmüGülsüm');


INSERT INTO B (B1, B3)
       VALUES (1, 'Ali');
INSERT INTO B (B1, B3)
       VALUES (2, 'Veli');
INSERT INTO B (B1, B3)
       VALUES (3, 'Süleyman');
INSERT INTO B (B1, B3)
       VALUES (4, 'Rüknettin');

Kod: Tümünü seç

execute block
returns (sai int, SA varchar(10),sbi int, SB varchar(10))
as
    declare variable counta int;
    declare variable countb int;
    declare variable cmx int;
    declare variable cntr int=0;
Begin
    select count(*) from a into :counta;
    select count(*) from b into :countb;
    cmx = maxvalue(counta,countb);
    cntr=0;
    while (cntr<cmx) do
    Begin
        sai=null;
        sbi=null;
        SA=null;
        sb=null;
        for select first 1 skip (:cntr) a.a1,a.a3 from a order by a.a1 into :sai, :SA do
        Begin
        End
        for select first 1 skip (:cntr) b.b1,b.b3 from b order by b.b1 into :sbi, :Sb do
        Begin
        End
        cntr = cntr +1;
        suspend;

    End
End;

Kod: Tümünü seç

SAI SA            SBI    SB
1   Leyla	      1      Ali
2   Şeyma	      2      Veli
3   Zeynep	      3      Süleyman
4   Rukiye	      4      Rüknettin
5   ÜmmüGülsüm    <null> <null>
dediğim işe yapıyor ama çok zahmetli vesselam :)


daha pratik yollara açığım
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2131
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Re: İlişkisiz join

Mesaj gönderen sadettinpolat »

Kod: Tümünü seç

with recursive x as (
  select 1 as ID
  ,(select x1.A3 from A x1 rows 1) as alan_adi
    from rdb$database
  union all
  select ID+1
  , (select  x1.A3 from A  x1 rows ID+1 to ID+1) as alan_adi
   from x where ID<(select count(*) from A)
),

y as (
  select 1 as ID
 ,(select  y1.B3 from B y1 rows 1) as alan_adi
   from rdb$database
  union all
  select ID+1
  , (select  y1.B3 from B y1 rows ID+1 to ID+1 ) as alan_adi
   from y where ID<(select count(*) from B)
)
select * from x
full join y on x.ID = y.ID

Kod: Tümünü seç

ID	ALAN_ADI	ID1	ALAN_ADI1
1	Leyla	1	Ali
2	Şeyma	2	Veli
3	Zeynep	3	Süleyman
4	Rukiye	4	Rüknettin
5	ÜmmüGülsüm null null		

cte ile oluyor ama senin yazdigin yontemden cok basit ve kullanisli midir bilemiyorum :)

islemde kisaca her iki tablodaki kayitlar icinde sirayla birer sanal id olusturulup bu id ler uzerinden join yapiliyor.
"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.

---
http://sadettinpolat.blogspot.com/
Kullanıcı avatarı
Lost Soul
Üye
Mesajlar: 1064
Kayıt: 01 Nis 2007 02:55
Konum: mekan ANKARA toprak ELAZIĞ
İletişim:

Re: İlişkisiz join

Mesaj gönderen Lost Soul »

Aha bu da son hali
execute block deyimine inputlu outputlu örnek teşkil etmesi için koyuyorum.

Kod: Tümünü seç

execute block ( ekipisid int=:ekipisid)
returns
(
    iekipisdetayid  int,
    ikod            skod,
    iaciklama       vc100 ,
    iserino         vc50,
    iolcubirimi     vc100,
    imiktar1        spara4,
    imiktar2        spara4,
    imiktar3        spara4,
    mekipisdetayid  int,
    mkod            skod,
    maciklama       vc100 ,
    mserino         vc50,
    molcubirimi     vc100,
    mmiktar1        spara4,
    mmiktar2        spara4,
    mmiktar3        spara4
)
as
    declare variable ciscilik int;
    declare variable cmalzeme int;
    declare variable cmax int;
    declare variable counter int=0;
    declare variable eid int;
Begin
    eid = ekipisid;
    select count(ekipisdetayid) from ekipisdetay where ekipisdetay.ekipisid=:eid and ekipisdetay.tur=1 into :ciscilik;
    select count(ekipisdetayid) from ekipisdetay where ekipisdetay.ekipisid=:eid and ekipisdetay.tur=2 into :cmalzeme;
    cmax = maxvalue(ciscilik,cmalzeme);
    counter =0;
    while (counter < cmax) do
    Begin
        iekipisdetayid  =null;
        ikod            =null;
        iaciklama       =null;
        iserino         =null;
        iolcubirimi     =null;
        imiktar1        =null;
        imiktar2        =null;
        imiktar3        =null;

        mekipisdetayid  =null;
        mkod            =null;
        maciklama       =null;
        mserino         =null;
        molcubirimi     =null;
        mmiktar1        =null;
        mmiktar2        =null;
        mmiktar3        =null;
        for select first 1 skip (:counter)
            ekipisdetayid,
            kod,
            aciklama,
            serino,
            olcubirimi,
            miktar1,
            miktar2,
            miktar3
        from ekipisdetay
        where
            ekipisdetay.ekipisid=:eid
            and
            ekipisdetay.tur = 1
        into
            :iekipisdetayid,
            :ikod,
            :iaciklama,
            :iserino,
            :iolcubirimi,
            :imiktar1,
            :imiktar2,
            :imiktar3
        do
        Begin
        End
        for select first 1 skip (:counter)
            ekipisdetayid,
            kod,
            aciklama,
            serino,
            olcubirimi,
            miktar1,
            miktar2,
            miktar3
        from ekipisdetay
        where
            ekipisdetay.ekipisid=:eid
            and
            ekipisdetay.tur = 2
        into
            :mekipisdetayid,
            :mkod,
            :maciklama,
            :mserino,
            :molcubirimi,
            :mmiktar1,
            :mmiktar2,
            :mmiktar3
        do
        Begin
        End
        counter = counter +1;
        suspend;
    End
End;
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Re: İlişkisiz join

Mesaj gönderen sabanakman »

FireBird satır numarası veren fonksiyon var mıdır acep? Varsa oradan iyi bir join çıkabilir :mrgreen: SQL 2005'e ROW_NUMBER() eklemişler :mrgreen: .
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Kullanıcı avatarı
Lost Soul
Üye
Mesajlar: 1064
Kayıt: 01 Nis 2007 02:55
Konum: mekan ANKARA toprak ELAZIĞ
İletişim:

Re: İlişkisiz join

Mesaj gönderen Lost Soul »

malesef firebirdde yok (v3 de olabilir belki) nette araştırdım bir kaç farklı yolla yapmaya çalışmışlar ama quantu fiziğine dönmüş :)
Cevapla