Subquery'de dublicate field name hatası - ÇÖZÜLDÜ

Diğer veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
mkysoft
Kıdemli Üye
Mesajlar: 3110
Kayıt: 26 Ağu 2003 12:35
Konum: Berlin
İletişim:

Subquery'de dublicate field name hatası - ÇÖZÜLDÜ

Mesaj gönderen mkysoft »

Veri tabanı mysql ama her veri tabanında olabilecek bir şey.
Şu şekilde iki tablom var;

Tablo 1
---------
a b c d

Tablo 2
--------------
a e f g d

select * from tablo1 join tablo2 using(a)

bir problem olmadan sorgu çalışıyor ama

select * from (select * from tablo1 join tablo2 using(a)) as tablo

şeklinde subquery yapınca d field'ı için dublicate hatası veriyor doğal olarak.
Tam olarak nasıl çözeceğimi bulamadım.
Yardım ederseniz sevinirim.
En son mkysoft tarafından 03 Ağu 2006 11:33 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
onaydin
Üye
Mesajlar: 202
Kayıt: 07 Şub 2006 02:30

Mesaj gönderen onaydin »

tablo2.*
tablo.a gibi kullanmak lazım
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Aynı isimli alanlar olduğundan o hatayı veriyordur. Alanların adlarını doğrudan yaz. select * from tablo ... sorgu yapısı tehlikeli ve perfomans açısından olumsuz bir yapıdır :idea:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
mkysoft
Kıdemli Üye
Mesajlar: 3110
Kayıt: 26 Ağu 2003 12:35
Konum: Berlin
İletişim:

Mesaj gönderen mkysoft »

Evet biliyorum ama subquery'im her zaman bu kadar basit olmuyor. Zaten bu sorgular az kullanılan raporlar için çağırılıyor. yapmak istediğim;
kayıt sayısı arttığı için kullanıcı sorguyu çalıştırmadan önce bazı şartlar girebilsin. raporda çağırdığım sorguların bazıları çok karışık bunları analiz edip doğru yerlere şartları yazmak çok daha zor olacaktır bu nedenle view lere benzer bir mantık kurdum.

select * from (mevcut sorgu) where yeni şartlar

Aslında dublicate olan alanlara pekde ihtiyacım yok. en azından sorgunun onlarsız geri dönmesini sağlayabilirsem sorunum çözülecek.
Eğer olmazsa tablolardaki benzer sütun adlarını değiştirmeyi düşünüyorum.

Teşekkürler.
onaydin
Üye
Mesajlar: 202
Kayıt: 07 Şub 2006 02:30

Mesaj gönderen onaydin »

SELECT * FROM (SELECT * FROM tablo1 join tablo2 using (id) ) as tablo

İfadesi mysqlde sorunsuz çalışıyor. Eklemediğiniz kısımda hata var.
mkysoft
Kıdemli Üye
Mesajlar: 3110
Kayıt: 26 Ağu 2003 12:35
Konum: Berlin
İletişim:

Mesaj gönderen mkysoft »

evet haklısın sorunsuz çalışıyor ama her her iki tablodada anahtar alan dışında aynı isme sahip field varsa hata veriyor.
onaydin
Üye
Mesajlar: 202
Kayıt: 07 Şub 2006 02:30

Mesaj gönderen onaydin »

İki tabloda da primary key den farklı aynı isimde alanlar var, yine hata vermiyor. Sadece where içinde kullanmaya kalktığınızda hangi a olduğunu bilmediğinden hata döndürüyor.
mkysoft
Kıdemli Üye
Mesajlar: 3110
Kayıt: 26 Ağu 2003 12:35
Konum: Berlin
İletişim:

Mesaj gönderen mkysoft »

mysql versiyonum 5.1.9

Kod: Tümünü seç

create table `test`.`tablo1` (    `a` varchar (5)   NOT NULL ,  `b` varchar (5)   NULL ,  `d` varchar (5)   NULL    )
create table `test`.`tablo2` (    `a` varchar (5)   NOT NULL ,  `e` varchar (5)   NULL ,  `d` varchar (5)   NULL  , PRIMARY KEY ( `a` )  )
insert into `tablo1` (`a`,`b`,`d`) values ( 'a','b','c')
insert into `tablo1` (`a`,`b`,`d`) values ( 'b','a','dd')
insert into `tablo2` (`a`,`e`,`d`) values ( 'a',NULL,NULL)
insert into `tablo2` (`a`,`e`,`d`) values ( 'b',NULL,NULL)
update `tablo2` set `a`='a',`e`='ffg',`d`='dfg' where `a`='a'
update `tablo2` set `a`='b',`e`='sd',`d`='adsf' where `a`='b'
yapısındaki tabloları oluşturduktan sonra;

Kod: Tümünü seç

select * from (select * from tablo1 join tablo2 using(a)) as tablo 
sorgunusunu çalıştırınca hata veriyor ve bundan doğal bişi olamaz. seninki neden hata vermiyor anlamadım?
onaydin
Üye
Mesajlar: 202
Kayıt: 07 Şub 2006 02:30

Mesaj gönderen onaydin »

Mysql 4.1.20 çalıştırıyor.
Bence hata vermesi veritabanı için daha dogru ama bunu alan adlarını değiştirmeden çözebileceğini düşünüyorum. tablo1.* şeklinde deneyince olmuyor mu?


Resim
mkysoft
Kıdemli Üye
Mesajlar: 3110
Kayıt: 26 Ağu 2003 12:35
Konum: Berlin
İletişim:

Mesaj gönderen mkysoft »

tablo2 deki alanlarada ihtiyacım var. ayrıca subquery olarak kullandığım alanda hangi tabloların çağrıldığını her zaman anlamak mümkün olmuyor(ne için böyle bir şey yapma istediğimi yukarıda yazmıştım). ayrıca yazsamda hata vermeye devam ediyor.

Bendeki versiyonda hata veriyor. Birde mysql'in kendi sitesinde sorayım bakalım ne çıkacak.

teşekkürler.
onaydin
Üye
Mesajlar: 202
Kayıt: 07 Şub 2006 02:30

Mesaj gönderen onaydin »

http://bugs.mysql.com/bug.php?id=6709

Benim karşılaştığım durumu bir bug olarak ele almışlar.
mkysoft
Kıdemli Üye
Mesajlar: 3110
Kayıt: 26 Ağu 2003 12:35
Konum: Berlin
İletişim:

Mesaj gönderen mkysoft »

Sorunuma kısmende olsa şu şekilde bir çözüm buldum. Bildiğiniz gibi HAVING komutu where,group by,order by parametrelerinden sonra kullanılabilir. sql sorgusunu taratıp içinde HAVING geçiyorsa yeni kriterleri oraya ekliyorum eğer yoksa sorgunun en sonuna having ile birlikte dahil ediyorum. Henüz çalışmayan sorgum olmadı.

İlginize teşekkürler.
Cevapla