SQL de union indekslemesin

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ı
musti
Üye
Mesajlar: 527
Kayıt: 11 Tem 2005 09:44

SQL de union indekslemesin

Mesaj gönderen musti »

Union ile 1 table icinde sıralı işlem yapıyorum .
once borclu olanları kod sıralı
sonra alacaklı olanları kod sıralı

tek basına borclu veya alacaklı olanlar kod sıralı geliyor (ben herhangi bir order by kullanmıyorum cunku zaten dosyamda indexli yapı var)

AMA
union ile birleştirince direk kod sıralı geligini icin alacaklılar karışıyor.

bunu nasıl onlerim.

zaten once borc olanlar kod sıralı, sonra alacagı olanlar kod sıralı gelsin olayını order by ile cozemdigim icin union yapmışıtım . şimdi ondada sorun cıktı :(
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Bildiğim kadar union yapısında order by kullanılamıyor. Onun yerine select lerdeki alanları gelmesini istediğiniz sırada yazın :idea:

Yani adına göre sıralama yapacaksanız;

Kod: Tümünü seç

select adi, borc from tablo
union
select ...
Yada borc alanına göre sıralanacaksa;

Kod: Tümünü seç

select borc, adi from tablo
union
select ...
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Kullanıcı avatarı
musti
Üye
Mesajlar: 527
Kayıt: 11 Tem 2005 09:44

Mesaj gönderen musti »

yok hocam,
order by kullanılıyor union da
ama benim istedigim hic indexlemesin zaten indexleme işlemini başaramadıgı için ben unionla once borclular sonra alacaklıları alıyorum.

sizin dediginiz gibi yapınca tip uyusmazligi olur hocam.

veya onu degistirsem hep borc alanı 0 olacak
aLonE CoDeR
Kıdemli Üye
Mesajlar: 1223
Kayıt: 26 Nis 2005 04:08

Mesaj gönderen aLonE CoDeR »

Anladığım kadarıyla sol elinle sağ kulanı tutmaya çalışıyorsun.Bunu daha sistematik bir şekilde çözmeyi dene bence..Ne yapmak istediğini tam olarak bilmediğim için net birşey söyleyemiyorum tabii.
Kullanıcı avatarı
musti
Üye
Mesajlar: 527
Kayıt: 11 Tem 2005 09:44

Mesaj gönderen musti »

net bir daha anlatayım

Kod: Tümünü seç

select kodu,sum(borc),sum(alacak) from tablo
order by ????*
once borc u alanlar kod sıralı gelecek sonra alacagı olanlar kod siralı gelecek yani

A01, 10,0
A02, 5,0
A01, 0,100
A02 0,50


İSTEDİGİM bu bunu order ile yapadıgım icin union kullandım

Kod: Tümünü seç


select kodu,sum(borc),sum(alacak) from tablo
where borc >0
union

select kodu,sum(borc),sum(alacak) from tablo
where alacak >0



bunları tek tek calistirgim zama sorun yok ama union edince koduna gore sıraladıgı icin yanlis oluyor, yan once ust sonra alt koda gor sıralı olacak


yada yukarıya bir order man-tı gı kurmak ki cok dusundum olmadı.

tskler
aLonE CoDeR
Kıdemli Üye
Mesajlar: 1223
Kayıt: 26 Nis 2005 04:08

Mesaj gönderen aLonE CoDeR »

Hata çıkış noktasında..Oluşturduğun yapı istediğin işlem için dolaylı yoldan günü kurtarmayı sağlar en fazla..Bunu önce gruplamalı, ardından sütunlara göre sıralamalısın.Ancak bu noktada büyükten küçüğe doğru (ya da tam tersi) sıralama olacağından istediğin işlemi yine yapmayacak..İki sp kullanarak bunu yapmak en mantıklı çözüm gibi görünüyor bence..

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

Mesaj gönderen fahrettin »

Order by kullanmadiginiz zaman sonuclarin nasil geleceğini bilemez ve garanti edemezsiniz... Belirli bir sıralama istiyorsanız order by kullanmanız şart....
Son yazdığınız kodu biraz geliştirirsek istediğiniz olur....

Kod: Tümünü seç

select SIRA=1, kodu,sum(borc),sum(alacak) from tablo
where borc >0
union
select SIRA=2,kodu,sum(borc),sum(alacak) from tablo
where alacak >0 
order by 1,2
* http://www.fahrettin.org Manzara Fotoğraflarım... :)
* http://delphiturkiye.gunduz.info Seminerler... ;)
* http://www.hakmar.com.tr Kalite bir haktır... 8)
Kullanıcı avatarı
musti
Üye
Mesajlar: 527
Kayıt: 11 Tem 2005 09:44

Mesaj gönderen musti »

fahrettin abi ver elim opeyim ya
allah razi olsun kac gundur ugrasiyorum

tsk ederim

ilgilenen arkadaslarin bilgisine
sira=1 firebird anlamiyor duzelttim onun yerine
cast(1 as integer)
derseniz sorunsuz calisiyor.
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Söylediğimde ısrar ediyorum. Çünkü son select teki order by tüm select için kullanılsa da burada alan adı yerine select içindeki sıra numarası kullanılabiliyor. (.. order by 1 veya order by 1,2 şeklinde) Ayrıca order by kullanılmamış ise select teki yazım sırasında sıralama yapılıyor. Fahrettin hocanın önerdiği her iki select i ayırmak için sabit bir alan kullanmak da güzel bir çözüm :wink:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

Estağfirullah.....
işinizin görülmesine sevindim...

Doğru Firebird bu atamayi desteklemiyor olabilir....
Tip dönüşümüne gerek kalmadan

Kod: Tümünü seç

Select 1 as SIRA ...
seklinde de kabul eder diye düşünüyorum...

Kolay gelsin...
* http://www.fahrettin.org Manzara Fotoğraflarım... :)
* http://delphiturkiye.gunduz.info Seminerler... ;)
* http://www.hakmar.com.tr Kalite bir haktır... 8)
t-hex
Kıdemli Üye
Mesajlar: 531
Kayıt: 18 Mar 2005 02:45
Konum: İstanbul/Antalya
İletişim:

Mesaj gönderen t-hex »

Merhaba,

Bir dip not olarak:

Kod: Tümünü seç

select * from tablo1 
plan (tablo1 natural)
bu gibi bir yazımla planı siz belirtebilirsiniz. index kullanmasını istemiyorsanızda natural yazıyorsunuz.
Cevapla