Firebird sıralama sorunu

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ı
veliadiguzel
Üye
Mesajlar: 197
Kayıt: 09 Tem 2003 02:11
Konum: Gebze/Kocaeli
İletişim:

Firebird sıralama sorunu

Mesaj gönderen veliadiguzel »

Selamün Aleyküm

Arkadaşlar başınıza daha önce geldimi bilemiyorum ama benim şöyle bir sıkıntım var.
select * from TEDBIRLER
order by id,tehlikeler_id,tedbir_id;
sql ve sonuc şimdilik 2 seviyeye düşürüp halletim ama 3 seviyede neden ters sıralıyor anlayamadım.


Resim

daha önce başına gelen varım internette biraz araştırdım case ile a b c d ye çevirdim ama gene olmadı.
Veli ADIGÜZEL
omurolmez
Üye
Mesajlar: 187
Kayıt: 31 Eki 2012 11:41

Re: Firebird sıralama sorunu

Mesaj gönderen omurolmez »

Resme göre herşey yolunda. tablo verilerini görmeden sıralamanın hatalı olduğunu söyleyemeyiz ki.
Öte yandan, bu order by ile resimdeki sonuçları verecek veriler mümkündür.

Mesela size hatalı görünen (68, 118, 4) ve (69, 118, 3) satırları aslında hatasız olabilir. Muhtemelen (68, 118) ve (69, 118) değerli satırlara baktığınızda (tablo ürerinde), 3. sütun için zaten başka alternatifi olmadığını göreceksiniz.
Ömür Ölmez
Kullanıcı avatarı
veliadiguzel
Üye
Mesajlar: 197
Kayıt: 09 Tem 2003 02:11
Konum: Gebze/Kocaeli
İletişim:

Re: Firebird sıralama sorunu

Mesaj gönderen veliadiguzel »

Dikkat ederseniz tedbir_id 1ile 5 arasında bir değer alıyor. şöyleki 113 numaralı
id tehlikeler_id tedbir_id
64 113 4
65 113 3
66 113 2
67 113 1

olmuş oysaki ben 3. seviyeninde 1,2,3,4 gibi gitmesini istiyorum.

118 dede dikkat ederseniz sıralama ters 5,4,3,2,1 gibi gitmiş.

sorguyu şu şekilde değiştirince olay düzeliyor.

Kod: Tümünü seç

select * from TEDBIRLER 
order by tehlikeler_id,tedbir_id;
Veli ADIGÜZEL
Kullanıcı avatarı
unicorn64
Üye
Mesajlar: 919
Kayıt: 04 Nis 2006 08:56
Konum: yine yeniden Ankara ^_^

Re: Firebird sıralama sorunu

Mesaj gönderen unicorn64 »

veliadiguzel yazdı:Dikkat ederseniz tedbir_id 1ile 5 arasında bir değer alıyor. şöyleki 113 numaralı
id tehlikeler_id tedbir_id
64 113 4
65 113 3
66 113 2
67 113 1

olmuş oysaki ben 3. seviyeninde 1,2,3,4 gibi gitmesini istiyorum.

118 dede dikkat ederseniz sıralama ters 5,4,3,2,1 gibi gitmiş.

sorguyu şu şekilde değiştirince olay düzeliyor.

Kod: Tümünü seç

select * from TEDBIRLER 
order by tehlikeler_id,tedbir_id;

aslında hem 113 hem de 118 için sorgu sonucu yazdığınız sqle göre geliyor, order by sorgu sonucunu belirttiğiniz alanlara göre sıralıyor,

order by id,tehlikeler_id,tedbir_id; dediğinizde

-sorgu sonuçlarını id alanına göre sırala,
-- id alanı aynı olan kayıtları tehlikeler_id alanına göre sırala,
--- id ve tehlikeler_id alanı aynı olan kayıtları tedbir_id alanına göre sırala

demiş oluyorsunuz
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ı
veliadiguzel
Üye
Mesajlar: 197
Kayıt: 09 Tem 2003 02:11
Konum: Gebze/Kocaeli
İletişim:

Re: Firebird sıralama sorunu

Mesaj gönderen veliadiguzel »

Bu şu mu demek oluyor benim istediğim gibi bir sıralama imkanı yok mudur ...?
Veli ADIGÜZEL
omurolmez
Üye
Mesajlar: 187
Kayıt: 31 Eki 2012 11:41

Re: Firebird sıralama sorunu

Mesaj gönderen omurolmez »

Ne yapmasını istiyorsunuz, tabloyu dikey olarak ikiye bölsün ve iki ayrı tabloymuş gibi farklı mı sıralasın ? O zaman order by ları farklı olan iki iki tane sub select i union ile birleştirmeyi deneyebilirsiniz. Ya da tasarımı gözden geçirebilirsiniz.

Order by ifadesini doğru anladığınızı, tablo tasarımının (siz veya kim yaptıysa) doğru yapıldığını varsayarak hareket ediyorsunuz. Peki emin misiniz ?
Ömür Ölmez
Kullanıcı avatarı
veliadiguzel
Üye
Mesajlar: 197
Kayıt: 09 Tem 2003 02:11
Konum: Gebze/Kocaeli
İletişim:

Re: Firebird sıralama sorunu

Mesaj gönderen veliadiguzel »

Aslında istediğim basit 3 kolona göre sırlama yapmak istiyorum.

böyle oluyor şu anda
id tehlikeler_id tedbir_id
64 113 4
65 113 3
66 113 2
67 113 1

benim istediğim...
id tehlikeler_id tedbir_id
64 113 1
65 113 2
66 113 3
67 113 4

id alanını iptal ettiğimde sonuç istediğim gibi oluyor işimi şimdilik çözdüm. Sadece aklıma takıldı.

Kod: Tümünü seç

select * from TEDBIRLER 
order by tehlikeler_id,tedbir_id;
tehlikeler_id tedbir_id
113 1
113 2
113 3
113 4

bu tablo çok klasik düz bir tablo oole karmaşık bir şey değil. Bu tablo tehlikeler tablosunun tedbirler ( Öneriler,Kazalar gibi diğer alt (detail) toblalarda var) alt (detail) tablosu tedbirlerin belli bir sıraya göre gösterilmesi gerekli.
Veli ADIGÜZEL
Kullanıcı avatarı
esistem
Üye
Mesajlar: 464
Kayıt: 02 Eki 2007 11:22
İletişim:

Re: Firebird sıralama sorunu

Mesaj gönderen esistem »

Selam,
ID alanınız o tablonuz için benzersiz bir numara olduğuna göre onu ekranda göstermenize gerek yoktur, dolayısı ile ;

Kod: Tümünü seç

select * from TEDBIRLER 
order by tehlikeler_id,tedbir_id; 
sorgusu sizin için yeterli olacaktır.
kullanıcı illaki ID veya kayıt sayısı görmek istiyorum derse o zamanda grid de rec no yu gösterirsiniz olur biter.
Kullanıcı avatarı
veliadiguzel
Üye
Mesajlar: 197
Kayıt: 09 Tem 2003 02:11
Konum: Gebze/Kocaeli
İletişim:

Re: Firebird sıralama sorunu

Mesaj gönderen veliadiguzel »

@esistem işimi o şekilde çözdüm hali hazırda ama aklıma takıldı dediğiniz gibi sıkınıtı çıkarssa oyle bir atraksiyon deneyeceğiz.
Veli ADIGÜZEL
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2247
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Re: Firebird sıralama sorunu

Mesaj gönderen Kuri_YJ »

Selamlar,

Order'larda soldaki kolon her zaman belirleyicidir ve sıralamayı doğru yapıyor. Bir sıkıntı yok. Sizin istediğiniz, ORDER BY ile yapılabilecek bir şey değil. Farklı bir metod izlemelisiniz. Anladığım kadarıyla şöyle bir şey istiyorsunuz,

A Kolonuna göre sıralasın, B Kolonunu da A Kolonundan bağımsız sıralasın, C Kolonunu da B ve A'dan bağımsız bir biçimde sıralasın. Yani her kolonu kendi içinde sıralasın.

Bunu ORDER BY ile yapmanız pek olası görünmüyor. Ayrıca sıralamayı B ye veya C'ye göre dizdiğinizde, Kaydın yeri değişecektir ve A Kolonundaki sıralama göz ardı edilmek zorunda kalacaktır.

Bence istediğiniz şey aslında ulaşmak istediğiniz şey olmayabilir. Bunu bir gözden geçirin bence.

Kolay Gelsin
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2247
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Re: Firebird sıralama sorunu

Mesaj gönderen Kuri_YJ »

Örneğinize Göre,

61, 55, 1
62, 104, 2
63, 104, 1

Şimdi ORDER BY A, B, C yaptığınızda öncelik A Kolonundadır.

Kayıtları inceleyelim,
1. Kayıt -> A=61, B=55, C=1
2. Kayıt -> A=62, B=104, C=2
3. Kayıt -> A=63, B=104, C=1
ORDER BY'da 1. Kolon A ve dizilimi Doğru (61, 62, 63)
2. Kolon B ve dizilimi Doğru (55, 104, 104)
3. Kolon C ve dizilimi Yanlış (Gibi görünüyor) 1, 2, 1

Şimdi sorguyu ORDER BY C olarak yapsaydık kayıt dizilimi şu şekilde olacaktı,
61, 55, 1
63, 104, 1
62, 104, 2
Dizilim C'ye göre doğru ama A ye göre yanlış. Bu sebeple ana kuralı göz ardı etmeden, soldan sağa doğru sıralamanızı yaptığınızda, öncelik en soldan en sağa doğru gittiği için aşağıdaki sıralama doğrudur.

61, 55, 1
62, 104, 2
63, 104, 1

Eğer kayıtlarınız şöyle olsaydı
61, 55, 1
62, 104, 2
62, 104, 1 (Baştaki 62 sayısını bilerek verdim). O Zaman ORDER BY A, B, C olarak çektiğiniz sorgunun yanıtı da şöyle olacaktı,

61, 55, 1
62, 104, 1
62, 104, 2

Yani A Kolonundaki değer sabir kalınca bir sonraki kolondaki sıralama geçerli, oradaki, da sabit bir değer olunca otomatik olarak en sağdaki kolona göre dizilim gerçekleşecekti.

Umarım anlaşılmıştır.

Kolay Gelsin
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Kullanıcı avatarı
veliadiguzel
Üye
Mesajlar: 197
Kayıt: 09 Tem 2003 02:11
Konum: Gebze/Kocaeli
İletişim:

Re: Firebird sıralama sorunu

Mesaj gönderen veliadiguzel »

@Kuri_YJ açıklamanız sayesinde olayı anladım aslında sıralama dogru ama A kolonu değiştiği için sıkıntı oluşuyor. A yı iptal edince işim halloldu aklıma takılmıştı sayenizde (tum cevap yazan arkadaşlar) anladım .

Teşekkürler.
A.R.O
Veli ADIGÜZEL
Cevapla