Forum

SOrgu Kartezyen ...
 
Bildirimler
Hepsini Temizle

SOrgu Kartezyen çarpım

9 Yazılar
2 Üyeler
0 Reactions
2,159 Görüntüleme
(@Anonim)
Gönderiler: 0
Konu başlatıcı
 

alter table #Personel
(
Ad varchar(100)
)
alter table #Masa
(
MasaAdi varchar(100)
)

insert into #Personel values('deneme1'),('deneme2'),('deneme3')
insert into #Masa values('Masa1'),('masa2'),('masa3')

select Ad,MasaAdi from
(
select ROW_NUMBER() over(partition by MasaAdi order by ID,Ad ) as Sira,ID,Ad,MasaAdi
from (
select newid() as ID,Ad,MasaAdi from #Personel
left outer join #Masa on 1=1
)t
) t2 where Sira = 1 order by Ad

Arkadaşlar sanal  table mantığıyla kartezyen çarpım sorgusu oluşturmaya çalışıyorum, ama hata veriyor . hatam nerde ?

 
Gönderildi : 23/06/2011 20:10

(@selahattinsadoglu)
Gönderiler: 826
Prominent Member
 

Merhaba,

Kodunuzu SQL Server 2008 üzerinde denedim.Hata almadım.Hangi DBMS versiyonunu kullanıyorsun?

select Ad,MasaAdi from
(
 select ROW_NUMBER() over(partition by MasaAdi order by ID,Ad ) as Sira,ID,Ad,MasaAdi
 from (
 select newid() as ID,Ad,MasaAdi
 from #Personel
 cross join #Masa
 )t
 ) t2 where Sira = 1 order by Ad

bu query kullandım.Herhangi bir hata almadım.Burada cross join olarak kullanmak daha iyi bir syntax kullanımı olacaktır.Aynı şekilde SQL Server 2008 üzerinde bu sorgu aynı sonucu veriyor.

Saygılar,

 
Gönderildi : 23/06/2011 20:59

(@Anonim)
Gönderiler: 0
Konu başlatıcı
 

Sql 2005 kullanıyorum ve aşağıda ki hatayı veriyor.

Msg 102, Level 15, State 1, Line 10
Incorrect syntax near ','.
Msg 102, Level 15, State 1, Line 11
Incorrect syntax near ','.

Ben bu örneği başka sql örneğinden editleyerek buldum sorduğum kişiler kod tasarımı normal dediği halde bende yukarıda ki hatayı veriyor

 

 
Gönderildi : 24/06/2011 11:15

(@selahattinsadoglu)
Gönderiler: 826
Prominent Member
 

Senin problemin select statement ile ilgili değildir.SQL Server 2008 içinde gelen özellikle multiple değerleri yukarıdaki deyim içinde eklenebiliyor.Fakat bunu SQL Server 2005 için kullanmak istiyorsanız o zaman ;

insert into #Personel values('deneme1')
insert into #Personel values('deneme2')
insert into #Personel values('deneme3')

insert into #Masa values('Masa1')
insert into #Masa values('masa2')
insert into #Masa values('masa3')

 

gibi kullanmalısınız.

 

Saygılar,

 
Gönderildi : 24/06/2011 12:26

(@Anonim)
Gönderiler: 0
Konu başlatıcı
 

insert into #Personel values('deneme1')
insert into #Personel values('deneme2')
insert into    #Personel values('deneme3')

insert into #Masa values('Masa1')
insert into #Masa values('masa2')
insert into #Masa values('masa3')

select Ad,MasaAdi from
(
 select ROW_NUMBER() over(partition by MasaAdi order by ID,Ad ) as Sira,ID,Ad,MasaAdi
 from (
 select newid() as ID,Ad,MasaAdi
 from #Personel
 left outer join #Masa on 1=1
 )t
 ) t2 where Sira = 1 order by Ad

 

Selehattin Bey Çok teşekkür ederim sorgum sorunsuz bi r bçimde çalıştı. Fakat Benim aklıma takılan bir sorum daha var örneğin

Personel  listesinden bazı kişiler 2 şer kere farklı masalara oturuyor. mesala

deneme1 -- masa2

deneme2 -- masa3

deneme1 -- masa1 gibi 

 

ben her personelin  her masaya ayrı ayrı oturmasını nasıl sağlayabilirm

 
Gönderildi : 24/06/2011 12:53

(@selahattinsadoglu)
Gönderiler: 826
Prominent Member
 

Sorunu anlamak biraz zor gibi.Öncelikle bize örnek bir veri girişi ve bununla ne tür veri çıkışı istediğini örnek veri olarak sağlarmısın?

 
Gönderildi : 24/06/2011 15:00

(@Anonim)
Gönderiler: 0
Konu başlatıcı
 

personeller deneme olarak adlandırılmıştır

Açıkça anlatmak gerekirse şu anda bu kodla aşağıda ki gibi bir çıktı oluşuyor,

deneme1 - masa2

deneme2 - masa3

deneme1 - masa1    gibi sonuç meydana geliyor.  aynı personel 2 defa farklı masalara dağalabiliyor. bu da mantık hatasından doğan iş aksaklıklarına yol açıyor.  mantık olarakta doğru olan benimde yapmak istediğim, 

deneme1-masa2

deneme2-masa3

deneme3-masa1   her personele farklı masaları payşaltırmak aynı personeli farklı masalara dağıtmak değil 

Tabi bu sadece işin başlangıçı ilerde dönüşü olmayan mantık hatalarına yol açmasın diye en küçük koddan başlayarak test etmek gerekiyor.

doğru anlatabilmişimdir umarım.

 
Gönderildi : 24/06/2011 16:17

(@selahattinsadoglu)
Gönderiler: 826
Prominent Member
 

Anladığım kadarıyla unique random atama yapmasını istiyorsunuz.Bunun için kullanma gereken sorgu;

with
cte1 as
(
    select *, row_number() over(order by newid()) RowNumber
    from #Personel
),
cte2 as
(
    select *, row_number() over(order by newid()) RowNumber
    from #Masa
)
select cte1.Ad, cte2.MasaAdi
from cte1
    join cte2 on
        cte1.RowNumber = cte2.RowNumber

 

Saygılar,

 
Gönderildi : 25/06/2011 13:59

(@Anonim)
Gönderiler: 0
Konu başlatıcı
 

Selehattin Bey verdiğiniz örneği sorguya entegre edemedim, sorgu üzerinden anlatabilirmisiniz?

 
Gönderildi : 29/06/2011 14:12

Paylaş: