Konuyu Oyla:
  • Derecelendirme: 5/5 - 1 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Where koşulunda özel işaret kullanımı hakkında
#21
(18-12-2018, Saat: 08:41)Tuğrul HELVACI Adlı Kullanıcıdan Alıntı:
   Select * 
    From TableA A, TableB B, TableC C
   Where
       A.TestA =* B.TestA
  and  C.TestC *= A.TestA

ifadesi bana kalırsa aşağıdaki gibi yazılabilir.

   
  Select *
  From TableA A
    RIGHT JOIN TableB B ON A.TestA = B.TestA
    LEFT JOIN TableC C ON C.TestC = A.TestA

Tuğrul Hocam Sizin yöntem benim uğraşıp sonuç alamadığım yöntemle aynı sonuç yanlış çıkıyor

(17-12-2018, Saat: 22:18)sabanakman Adlı Kullanıcıdan Alıntı: 3 lü birleştirmeye girmeden sadece iki tablo arasında *= veya =* operatörleri tam olarak nasıl çalışıyor deneme ortamım olmadığı için net bir cevap oluşturamadım zihnimde ama yukarıdaki örneğe göre aşağıdaki sorgu ile sonucu az çok tutturmak mümkün gibi Smile .
select case when C.TestC=A.TestA then A.TestA end as TestA, case when C.TestC=A.TestA then A.TAAciklama end as TAAciklama, * from TableA as A
right join TableB as B on A.TestA=B.TestA
right join TableC as C on 1=1

İşin aslı sistem nasıl çalışıyor iyi izah edemeyebilirim ama sanırım where şartında birbiri arasında ilişki kurulmayan TableB ve TableC kartezyen çarpımına TableA right join ile olaya dahil olmakta!
select * from TableA as A 
right join (select B.TestB, B.TestA, B.TBAciklama, C.TestC, C.TestB as TestB_C, C.TCAciklama from TableB as B, TableC as C) as tbl on A.TestA=tbl.TestA and A.TestA=tbl.TestC
gibi bir sorgu ile verdiğiniz liste alınabiliyor.

Bu sorgular çalıştı 
peki hocam bunu iç içe yapmadan normal joinlerle nasıl çözeric bazı sorgularda 10'dan fazla alan birleştirilmiş 
hata yapma ihtimalim çok fazla daha basite indirgenebilirmi
Bu dünyada kendine sakladığın bilgi ahirette işine yaramaz. 
Cevapla
#22
Sorgularda * tarafına doğru join yapıldığını varsayarsak.
select * From TableA A, TableB B, TableC C Where A.TestA =* B.TestA and  C.TestC *= A.TestA
şeklindeki bir sorguda B ve C tablosuna doğru yönelen joinler bulundurmaktadır. Fakat bu iki tablo arasında herhangi bir ilişki belirtilmediği için bu iki tablo çapraz eşleşme (cross join) ile birleştirilmelidir. Ortaya çıkan bu çapraz eşleşmeyle oluşan kümeye A tablosu sonradan iliştirilirse yukarıdaki gibi bir sonuç gelmekte. Kısacası where şartında verilen şartların yerine, sırasına, yönüne bağlı olarak değişebilen yapıya sahip sorgularınız. Maalesef basit bir formülasyonu bulunmamakta gibi Confused . En azından örnek sorgunuzla aynı listeyi üreten join sorgu karşılığı aşağıdaki gibi olmaktadır.
select A.*, B.*, C.* from TableB B

cross join TableC C
left join TableA A on A.TestA=B.TestA and C.TestC=A.TestA
Kolay gelsin.
Cevapla
#23
Bu sorguda sonuç tablosu nasıl olmalı ki ?
WWW
Cevapla
#24
(18-12-2018, Saat: 14:04)sabanakman Adlı Kullanıcıdan Alıntı: Sorgularda * tarafına doğru join yapıldığını varsayarsak.
select * From TableA A, TableB B, TableC C Where A.TestA =* B.TestA and  C.TestC *= A.TestA
şeklindeki bir sorguda B ve C tablosuna doğru yönelen joinler bulundurmaktadır. Fakat bu iki tablo arasında herhangi bir ilişki belirtilmediği için bu iki tablo çapraz eşleşme (cross join) ile birleştirilmelidir. Ortaya çıkan bu çapraz eşleşmeyle oluşan kümeye A tablosu sonradan iliştirilirse yukarıdaki gibi bir sonuç gelmekte. Kısacası where şartında verilen şartların yerine, sırasına, yönüne bağlı olarak değişebilen yapıya sahip sorgularınız. Maalesef basit bir formülasyonu bulunmamakta gibi Confused . En azından örnek sorgunuzla aynı listeyi üreten  join sorgu karşılığı aşağıdaki gibi olmaktadır.
select A.*, B.*, C.* from TableB B

cross join TableC C
left join TableA A on A.TestA=B.TestA and C.TestC=A.TestA
Kolay gelsin.

Hocam elin kolun dert görmesin 
tamda istediğim bu işin mantığıydı +10 verdim Admin ancak bu kadarına izin vermiş 
elde olsa +100 ve yıldızlı olurdu bu cevap bana göre
Bu dünyada kendine sakladığın bilgi ahirette işine yaramaz. 
Cevapla
#25
Left Yada Right Join ile bir Tablodaki kayıtlar baz alınır diğer tablodaki kayıtlar da eşleşen eşleştirilir diğerleri boş olarak listelenir
inner join ile birleştiriniz
on ile karşılaştırdığınız alanların kontrol ediniz
Cevapla
#26
Aşağıdaki konuda yardımlarınızı rica ederim.
Elimdeki scriptlerin bir çoğunu hallettim fakat böyle bir şey var ve işin içinden çıkamadım
Yardımcı olabileceklere şimdiden teşekkürler

Select * 
   from dbo.T_SIPARISKUMAS s,
        dbo.T_MODELKUMAS k,
        dbo.T_KUMASONAY L,
        dbo.T_SIPARISPROCESS m
  where S.SIPARISNO       = m.SIPARISNO
    and S.MODELNO         = m.MODELNO
    and ( (ISNULL( m.PAKETNO,0) >0) or (s.PROCESSRENK = m.RENK ))

    and S.MODELKUMASSIRANO *= l.KUMASSIRANO
    and s.PROCESSRENK      *= L.PROCESSRENK

    and L.SIPARISNO =* s.SIPARISNO
    and k.SIRANO  =* S.MODELKUMASSIRANO

Bu dünyada kendine sakladığın bilgi ahirette işine yaramaz. 
Cevapla
#27
Koşulların tamamında S tablosuna LET JOIN var.


Select S.*, K.*, L.*, M.*
  FROM dbo.T_SIPARISKUMAS s        

 LEFT JOIN dbo.T_SIPARISPROCESS m
   ON S.SIPARISNO       = m.SIPARISNO
     and S.MODELNO       = m.MODELNO
     and ( (ISNULL( m.PAKETNO,0) >0) or (s.PROCESSRENK = m.RENK ))

 LEFT JOIN dbo.T_KUMASONAY L
   ON S.MODELKUMASSIRANO = L.KUMASSIRANO
     and S.PROCESSRENK = L.PROCESSRENK
     and S.SIPARISNO = L.SIPARISNO

 LEFT JOIN dbo.T_MODELKUMAS k
   ON S.MODELKUMASSIRANO = k.SIRANO
Cevapla
#28
(02-01-2019, Saat: 14:55)adelphiforumz Adlı Kullanıcıdan Alıntı:
Select * 
   from dbo.T_SIPARISKUMAS s,
        dbo.T_MODELKUMAS k,
        dbo.T_KUMASONAY L,
        dbo.T_SIPARISPROCESS m
  where S.SIPARISNO       = m.SIPARISNO
    and S.MODELNO         = m.MODELNO
    and ( (ISNULL( m.PAKETNO,0) >0) or (s.PROCESSRENK = m.RENK ))

    and S.MODELKUMASSIRANO *= l.KUMASSIRANO
    and s.PROCESSRENK      *= L.PROCESSRENK

    and L.SIPARISNO =* s.SIPARISNO
    and k.SIRANO  =* S.MODELKUMASSIRANO

Burada da S ile M tabloları inner join'e tabi tutulmuş ve K ve L tabloları ise S tablosuna doğru join olmuş gibi görünüyor. Tahmini olarak sorgunun karşılığı
select * from dbo.T_SIPARISKUMAS s
inner join dbo.T_SIPARISPROCESS m on S.SIPARISNO = m.SIPARISNO and S.MODELNO = m.MODELNO and ((ISNULL( m.PAKETNO,0) >0) or (s.PROCESSRENK = m.RENK ))
left join dbo.T_MODELKUMAS k on k.SIRANO  = S.MODELKUMASSIRANO
left join dbo.T_KUMASONAY L on S.MODELKUMASSIRANO = l.KUMASSIRANO and s.PROCESSRENK = L.PROCESSRENK and L.SIPARISNO = s.SIPARISNO
olabilir ama deneme imkanı sizde var sadece. Aslında bu sorgu neyi amaçlıyorsa biraz da ona odaklanıp, sorguyu yazmak gerekebilir. Bazı durumlarda yanlış çalışma olasılığı bulnan sorguyu yakalayıp düzeltme imkanınız olacaktır.
Cevapla
#29
@sabanakman  ve @ssahinoglu  hocam teşekkürler

Malesef elime sadece içi boş bir veritabanı verildi. (sorgunun doğru hali ile değiştirdiğimde geleni kontrol edecek data bile yok) 
bu veritabanı içerisinde *= ve =* ifadeleri olan tüm ne varsa bunları join yapısına uygun convert etmem istendi.
Hangi tablo hangi iş için kullanılıyor sadece isminden tahmin yolu ile gidiyorum.
Yani anlıyacağınız delete olan bir sorguda kazara left join yerine right join olursa sonucu düşünmek bile istemiyorum.

"Bindik bir alamete gidiyoz kıyamete" bunun için söylenmiş sanırım
belki ilerde bir iki teşekkür daha etmem gerekebilir size  Smile Angel
Bu dünyada kendine sakladığın bilgi ahirette işine yaramaz. 
Cevapla
#30
El yordamı gidelim o zaman Big Grin . Mevcut 4 tablo, permutasyonla (kartezyen çarpımdan) oluşan eşleşmeler aşağıdaki gibi bir şekilde olacaktır.
S, K, L, M ->
(S  x  K), (S  x  L), (S  x  M), (K  x  L), (K  x  M), (L  x  M)
Belirttiğiniz "where" şartındaki ilişkilere göre ise ilişkilendirme yönü
(S<= K), (S<= L), (S<=>M)
şeklindedir. Yani bütün tablolar S ile ilişkilendirilmiş ve K ile L (M inner join gibi olduğundan hariç tutmak daha uygun sanırım) arası bir ilişki yok. Bu iki tablo S'ye doğru join oluşturmuş olduğundan bunlardan ayrı bir küme oluşturup S'ye öyle join yapmakta fayda var gibi. Ne kadar doğru bilmiyorum ama son  tahminim aşağıdaki gibi olacaktır.
select * from 
(
 select *, S.MODELKUMASSIRANO as S_MODELKUMASSIRANO, s.PROCESSRENK as s_PROCESSRENK, s.SIPARISNO as s_SIPARISNO from dbo.T_SIPARISKUMAS s, dbo.T_SIPARISPROCESS m
 where S.SIPARISNO=m.SIPARISNO and S.MODELNO=m.MODELNO and ((ISNULL(m.PAKETNO,0)>0) or (s.PROCESSRENK=m.RENK ))
) sm
left join
(
 select *, l.KUMASSIRANO as l_KUMASSIRANO, L.PROCESSRENK as L_PROCESSRENK, L.SIPARISNO as L_SIPARISNO, k.SIRANO as k_SIRANO from dbo.T_MODELKUMAS k, dbo.T_KUMASONAY L
) as kl on sm.S_MODELKUMASSIRANO = kl.l_KUMASSIRANO and sm.s_PROCESSRENK=kl.L_PROCESSRENK and kl.L_SIPARISNO=sm.s_SIPARISNO and kl.k_SIRANO=sm.S_MODELKUMASSIRANO
Yalnız bu sorgu (parantez içindeki (select)) alt sorgularda aynı isme ait alanlar varsa hata verecektir. Bir alt sorgudan aynı isme sahip çok alan çıkmaması gerekmektedir. Bu yüzden (select * from sorgularda * yerine) alanları tek tek elle yazmanız gerekebilir.
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Sql Insert Into parametre kullanımı hk. cinarbil 7 273 01-03-2019, Saat: 17:47
Son Yorum: cinarbil
  MS SQL 2008 r2 ile Extract Kullanımı enes6635 5 478 01-12-2018, Saat: 23:15
Son Yorum: enes6635
  sql Open ve Execsql çalıştırma hakkında cinarbil 3 465 18-09-2018, Saat: 07:57
Son Yorum: cinarbil
  SQL Self Join Yöntemi Hakkında adelphiforumz 7 718 20-07-2018, Saat: 09:55
Son Yorum: adelphiforumz
  MSSQL Sistem Taşıması Hakkında adelphiforumz 8 884 21-04-2018, Saat: 02:30
Son Yorum: FiRewaLL



Konuyu Okuyanlar: 1 Ziyaretçi