Select cümlesi

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
onaydin

Select cümlesi

Mesaj gönderen onaydin »

Dört tablomuz var;
URUN P, URUN_OZELLIK PP, UYE U,UYE_OZELLIK UO
P tablosunda URUN_NO alanı mevcut,
(P.URUN_NO, AD)
PP tablosunda P tablosundaki ürünlerin özellikleri tutuluyor (her bir ürün için 70 kadar özellik),
ve tabloda özelliğin var olup olmadığıyla ilgili bir
VAR alanı mevcut.
(PP.URUN_OZELLIK_NO,URUN_NO,OZELLIK_NO,VAR(bit))

U tablosunda UYE_NO(PK) var ve uye bilgileri tutuluyor
(U.UYE_NO,AD) -> bu tablo aslında önemli değil)

UO tablosunda ise UYE_NO(FK) ve OZELLIK_NO alanı var
eğer bu tabloda bir ozellik no geçmişse bu değerin
PP içinde geçiyor olması lazım.
(UO.UYE_OZELLIK_NO,UYE_NO,OZELLIK_NO)

Mesela sorgu şuki
Ben 2 nolu uyenin aradığı üründe mutlaka olmazsa olmaz dediği özellikleri (UO tablosundakiler) taşıyan (PP tablosu)
ürünleri listelemek istiyorum.
Kullanıcı avatarı
naile
Admin
Mesajlar: 1873
Kayıt: 11 Haz 2003 10:11

Re: Select cümlesi

Mesaj gönderen naile »

Kod: Tümünü seç

SELECT * FROM URUN
WHERE URUN_NO IN (SELECT URUN_NO FROM URUN_OZELLIK WHERE OZELLIK_NO IN (SELECT OZELLIK_NO FROM UYE_OZELLIK WHERE UYE_NO=2))
Başka türlüde yapılabilir de kolay yöntem ilk bu geldi aklıma :)
onaydin

Mesaj gönderen onaydin »

kolay yöntem ilk bu geldi aklıma
Malesef :oops: ;
Bu şekilde yazıldığında sadece bir özelliği tutturan otomobillerde listeleniyor.
Oysaki burda bütün özellik şartlarına uyan otomobillerin gelmesi gerekiyor.
onaydin

Mesaj gönderen onaydin »

Ayriyeten şunu da ilave edeyim;
Mesela üyelerden bir tanesi hiç bir şart koşmamış olabilir ve bu sebeple
UO tablosunda bu uyeye ait kayıt olmayabilir, o zaman
bütün ürünleri listelemesi gerekiyor.
Halbuki

Kod: Tümünü seç

SELECT OZELLIK_NO FROM UYE_OZELLIK WHERE UYE_NO=2
şeklinde ilişkilendirirseniz otomatik olarak hiç kayıt dönmez.
Kullanıcı avatarı
lazio
Moderator
Mesajlar: 1527
Kayıt: 11 Tem 2003 04:55
Konum: İstanbul

Mesaj gönderen lazio »

Kod: Tümünü seç

select p.* from p, pp, u, uo
where 1 = 1 or (p.ukodu = pp.ukodu and
          pp.ozellikno = uo.ozellikno and
          uo.uyeno = u.uyeno)
DeveloperToolKit

..::|YeşilMavi|::..
onaydin

Mesaj gönderen onaydin »

Bu da yanlış sonuç dönderiyor.
Kullanıcı avatarı
naile
Admin
Mesajlar: 1873
Kayıt: 11 Haz 2003 10:11

Mesaj gönderen naile »

onaydin yazdı:
kolay yöntem ilk bu geldi aklıma
Malesef :oops: ;
Bu şekilde yazıldığında sadece bir özelliği tutturan otomobillerde listeleniyor.
Oysaki burda bütün özellik şartlarına uyan otomobillerin gelmesi gerekiyor.
Ama IN kullanıldığı için hepsi gelmesi lazım gibi geliyor bana :roll:
onaydin

Mesaj gönderen onaydin »

Kod: Tümünü seç

SELECT * FROM "DBA"."URUN_OZELLIK" where OZELLIK_NO in (1,2,3) order by URUN_NO
Dönen sonuçlar ;
URUN_NO | OZELLIK_NO
1 1
1 2
1 3
2 3
5 3
8 3
10 3
11 3
22 2
oysa istediğimiz sadece bir nolu ürünün gözükmesi diğerlerinin düşmesi
Kullanıcı avatarı
naile
Admin
Mesajlar: 1873
Kayıt: 11 Haz 2003 10:11

Mesaj gönderen naile »

Burda sanırım bende bir yanlış anlama var. Siz zaten bu özellikleri isteyenleri listeletmek istemiyor musunuz? Yani 1,2,3. Ama siz sadece 1 dediniz 2 3 olmasın dediniz. Bunu neye göre belirliyorsunuz? Burdaki 1,2,3 üyelerin aradığı özellikler değilmi özellik tablosundan dönen değerler değil mi?
onaydin

Mesaj gönderen onaydin »

Dönen kayıtlardan sadece 1 nolu ürün 1,2 ve 3 nolu özelliklere sahip
diğerleri ise bu özelliklerden sadece birine veya ikisine sahip bu nedenle onların listelenmemesi gerekiyor.
Zaten ilk mesajımda da olmazsa olmaz özellikler demiştim.

Pek içime sinmesede şu şekilde hazırladım baya bi ilke oldu ama;

Kod: Tümünü seç

select l.URUN_NO from
(select count(OZELLIK_NO) as TOPLAM_OZELLIK from UYE_OZELLIK where UYE_NO = 2513)as P,
(select URUN_NO,isnull(m.TOPLAM,0)as TOPLAM from(
select URUN_NO,count(OO.OZELLIK_NO) as TOPLAM from URUN_OZELLIK OO, UYE_OZELLIK U 
where U.UYE_NO = 2513 and
U.OZELLIK_NO = OO.OZELLIK_NO and OO.VAR_YOK = 1
group by URUN_NO
union select URUN_NO,NULL from URUN_OZELLIK group by URUN_NO) as m
) as l where l.TOPLAM = P.TOPLAM_OZELLIK
Cevapla