2016-04-14 19 views
1

Temel sorum, sorgumda belirtilen değerlerden aynı anda birden fazla sütunu güncellemeyle ilgili. Bunu yapmak istediğim şey, değerlerimi ginormous tablosundan güncellememdir, bu yüzden sadece çalışma süresini azaltmak için bir kez sorgulamak istiyorum.TSQL - Güncelleştirmelerde Birden Çok Sütun Üzerinde Yapılan Açıklamalar

Ben muktedir olmak istiyorum Aynı anda birden fazla sütun güncellemek için
select a.Value 
from Table1 
left outer join 
(
select ID, FilterCol1, FilterCol2, Value 
from Table2 
) a on a.ID = Table1.ID 
where {Condition1a on FilterCol1} 
and {Condition2a on FilterCol2} 

böyle bir şey yapmak: İşte sütunlardan sadece biri için istediğiniz değeri döndüren bir örnek select ifadesi örneğidir ben güncellemeniz gerekir Bu (ama NULL döndürür):

Update T1 
set T1Value1 = (select a.Value where {Condition1a on FilterCol1} 
and {Condition2a on FilterCol2) 
,T1Value2 = (select a.Value where {Condition1b on FilterCol1} 
and {Condition2b on FilterCol2}) 
from Table1 T1 
left outer join 
(
select ID, FilterCol1, FilterCol2, Value 
from Table2 
) a on a.ID = Table1.ID 

büyük takdir bu out endam herhangi bir yardım, herhangi bir sorunuz varsa bana bildirin yoksa herhangi bir hata yaptıysam. Teşekkürler!

DÜZENLEME: Sanırım sorunu tespit ettim, ama henüz bir çözümden emin değilim. Bence bu konunun biraz daha fazla bağlam gerektirdiğini düşünüyorum: Tablo 2'deki seçim aslında geniş bir tablonun üzerinde yer almıyor. Bu, left outer join uygulandığında, belirli bir kimlik için birden fazla satırın olacağı anlamına gelir. Earl'in önerdiği durum ifadesi ne yapıyor gibi görünüyor (ve bunun nerede olduğuyla birlikte olduğunu tahmin ediyorum) Koşullarımı sadece ilk sütunlara a. Koşullarım, a arasındaki satırların hangisinin seçileceğini belirlemeye yardımcı olduğundan, her zaman ilk satır için yanlışları değerlendireceklerdir (bunu veri hakkında bildiğimden biliyorum), dolayısıyla kalıcı NULL değerleri. a'daki diğer satırlara bakmak için bir geçici çözüm bilen var mı?

cevap

0
UPDATE T1 
SET T1Value1 = CASE WHEN (FilterCol1 = Condition1a AND FilterCol2 = Condition2a) THEN a.Value END, 
    T1Value2 = CASE WHEN (FilterCol1 = Condition1b AND FilterCol2 = Condition2b) THEN a.Value END 

FROM Table1 T1 
left outer join 
     (
     select ID, FilterCol1, FilterCol2, Value 
     ) a on a.ID = Table1.ID 
+0

Cevabınız için teşekkürler Earl, maalesef bu benim için çalışmadı (yine de null). Bunun gerçekten de “T1ValueX” içine hangi değerlerin koyulduğunu filtreleyecek mi yoksa “Tablo1” in hangi satırlarının güncellendiğini filtreleyecek mi diye merak ediyorum. FilterCol (1,2) 'nin Table2''den sütunlar değil, Condition (1,2) (a, b, ...)' 'Table1''de değerlere bakması fark yaratır mı? –

+0

Tabloları ve örnek verileri ekleyebilir misiniz? – EarlOfEnnui

+0

WHERE maddesi, güncellenen satırları filtreleyecektir. CASE değeri seçerdi. Tabloları değerlerin hangi tablodan geldiğini doğru bir şekilde bağlamış olmanız fark etmez. Tabloları birleştirmek, belki de yeni ve sql için yeni insanlar için en kolay yanlış anlaşılmış yönlerdir. Gelecekte sorularınız varsa, bir tablo (lar) ve test verisi oluşturmayı öneririm. – EarlOfEnnui

İlgili konular