Nasıl bir tablo adına göre SQL katılmak yapacağız?

oy
0

Ok, bu nedenle böyle adlandırılır tablolar bir grup var:

training_data_001
training_data_002
training_data_003
training_data_004
training_data_005

Sonra başka bir tablodaki bir alana bakmak olanlar bulmak için, 'adil bunun master.training_type diyelim.

Herkes verilerinin bu tür katılmak tabanlı bir garip tablo adını yapmanın bir yol bildiğini Neyse, merak ediyorum. Böyle bir şey:

SELECT foo FROM master WHERE id = ? 
INNER JOIN training_data_${master.training_type}
ON foo.id = training_data_${master.training_type}.foo_id

Ben istemci tarafında bu yapabileceğini biliyorum, ama db bunu yapması hoş olurdu.

Ayrıca dikkat: SQL Server bu.

Güncelleme : Ben sadece istemci tarafında yapmaya karar verdik. Yine de teşekkürler herkese.

Teşekkürler!

-fREW

Oluştur 09/12/2008 saat 20:54
kaynak kullanıcı
Diğer dillerde...                            


5 cevaplar

oy
2

Yalnızca sonra kullanarak yürütmek bir dize oluşturmak için master.training_type okumak için dinamik SQL kullanabilirsiniz EXEC (@stringvar)

Cevap 09/12/2008 saat 20:57
kaynak kullanıcı

oy
1

paylaştırıldı görünüşüdür olası bir yaklaşımdır. Yalnızca foo sütununu seçerek olduğundan, gerçekten sadece INNER JOIN aracılığıyla eğitim tablosundaki bir satırın varlığını kontrol ediyoruz? Ayrıca, senin katılmak takma ad şeklinde foo kullanmaya çalışıyorsanız gibi görünüyor, ama senin SELECT yan tümcesinde bu şekilde kurmak değil. Sonuç olarak ben gerçekten ne istediğini burada tahmin ediyorum.

Başka soru ... eğitim tabloları seti durağandır? Yeni bir eki numarasına sahip yeni tablo eklemek edebilmek için bekliyor musunuz ve o zaman çalışır mı?

Bir diğer olası çözüm:

SELECT
     foo
FROM
     dbo.master m
WHERE
     (training_type = '001' AND EXISTS (SELECT * FROM dbo.training_data_001 WHERE foo_id = m.id)) OR
     (training_type = '002' AND EXISTS (SELECT * FROM dbo.training_data_002 WHERE foo_id = m.id)) OR
     (training_type = '003' AND EXISTS (SELECT * FROM dbo.training_data_003 WHERE foo_id = m.id)) OR
     (training_type = '004' AND EXISTS (SELECT * FROM dbo.training_data_004 WHERE foo_id = m.id)) OR
     (training_type = '005' AND EXISTS (SELECT * FROM dbo.training_data_005 WHERE foo_id = m.id))

Aslında eğitim verileri tablodan sütun dönmek isterseniz o zaman böyle bir şey kullanabilirsiniz:

SELECT
     m.id,
     COALESCE(t1.my_col, t2.my_col, t3.my_col, t4.my_col, t5.my_col) AS my_col
FROM
     dbo.master m
LEFT OUTER JOIN dbo.training_data_001 t1 ON m.training_type = '001' AND t1.foo_id = m.id
LEFT OUTER JOIN dbo.training_data_002 t1 ON m.training_type = '002' AND t2.foo_id = m.id
LEFT OUTER JOIN dbo.training_data_003 t1 ON m.training_type = '003' AND t3.foo_id = m.id
LEFT OUTER JOIN dbo.training_data_004 t1 ON m.training_type = '004' AND t4.foo_id = m.id
LEFT OUTER JOIN dbo.training_data_005 t1 ON m.training_type = '005' AND t5.foo_id = m.id
Cevap 09/12/2008 saat 21:43
kaynak kullanıcı

oy
1

Böyle bir şey yapmak:

create view training_data_all as
select '001' as training_type, * from training_data_001
union all
select '002' as training_type, * from training_data_002
union all
select '003' as training_type, * from training_data_003
union all
select '004' as training_type, * from training_data_004
union all
select '005' as training_type, * from training_data_005

sonra sadece seçmek ve ondan / 'e katılmak:

SELECT foo FROM master WHERE id = ? 
INNER JOIN training_data_all
ON foo.id = training_data_all.foo_id
WHERE training_data_all.training_type = ${master.training_type}

tablo listesi / büyümek zaman içinde küçültmek için ise, dinamik sistem tablolarına bazı aramaları yaparak mevcut tablolarına dayanarak bu aynı görünüm yazabilir.

Bunların hiçbiri olsa çok etkilidir. Bazı sabit aralıklarla bir araya getirilen tabloya sadece ETL bu veriler Can?

Cevap 09/12/2008 saat 21:22
kaynak kullanıcı

oy
1

Tablolar hepsi aynı yapı ise, bir oluşturmak Kisimlandirilmis Görünüm tablolar arasında ve görüş karşı katılmak. Sorgu optimiser bölümü ortadan kaldırılması yapmak, böylece bir sütun (belki bir tarih) üzerinde bir kontrol kısıtı yapmak gerekir.

Cevap 09/12/2008 saat 21:03
kaynak kullanıcı

oy
1

Yalnızca kayıtlı proc dinamik SQL ile bunu yapabilirsiniz. Eğer güvenlik veya başka nedenlerle anında yapmak istemiyorsanız Ayrıca kod üretimi ile önceden görünümleri veya depolanmış procs üretebilir.

Cevap 09/12/2008 saat 20:57
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more