2012-01-26 21 views
9

Bir tarih güncelleyen bir sorguyu, yalnızca grup im güncelleştirmesinin 50 LINE_CD'si varsa sorgulamaya çalışıyorum. Bunu böyle yapar mıyım? Eğer bir sorgudan bu bilgiyi elde eğerWHERE EXISTS ile SQL UPDATE deyimi

UPDATE EMPLOYER_ADDL 
SET EMPLOYER_ADDL.GTL_UW_APPRV_DT = EMPLOYER_ADDL.DNTL_UW_APPRV_DT 
WHERE EXISTS 
    ( 
     SELECT EMP_PLAN_LINE_INFO.LINE_CD 
     FROM EMP_PLAN_LINE_INFO 
     Where EMP_PLAN_LINE_INFO.GR_NBR = EMPLOYER_ADDL.GR_NBR and 
     EMP_PLAN_LINE_INFO.LINE_CD = 50 
    ) 
+5

Evet ............ Birçok "doğru cevapları" var – JNK

+1

iyi şanslar birini seçerek onlar. – SQLMason

+1

Teşekkür ederim, gerçekten – user1152145

cevap

9

Bu nedir?

UPDATE EMPLOYER_ADDL 
SET EMPLOYER_ADDL.GTL_UW_APPRV_DT = EMPLOYER_ADDL.DNTL_UW_APPRV_DT 
WHERE EXISTS 
    ( 
     SELECT * 
     FROM EMP_PLAN_LINE_INFO 
     Where EMP_PLAN_LINE_INFO.GR_NBR = EMPLOYER_ADDL.GR_NBR and 
     EMP_PLAN_LINE_INFO.LINE_CD = 50 
    ) 

olsa İÇİNDE kullanmayı tercih: Ben varolduğuna inandığı

UPDATE ea 
SET ea.GTL_UW_APPRV_DT = ea.DNTL_UW_APPRV_DT 
FROM EMPLOYER_ADDL ea 
    INNER JOIN EMP_PLAN_LINE_INFO ei ON(ei.GR_NBR = ea.GR_NBR) 
WHERE 
ei.LINE_CD = 50 
+1

Buradaki tek sorun, birleştirmenin kopyalar oluşturması (örneğin, EMPLOYER_ADDL veya EMP_PLAN_LINE_INFO'da GR_NBR'nin benzersiz olmaması) durumunda ekstra bir çalışmadır. Ben EXISTS formatı daha güvenli olduğunu düşünüyorum çünkü her iki senaryo için de geçerlidir. YMMV. –

+1

GR_NBR, EPLI tablosunda benzersiz DEĞİLDİR, ancak ADDL içinde. Ekstra çalışma ile sorgunun daha uzun süreceği anlamına mı geliyor? – user1152145

12
UPDATE ea 
    SET GTL_UW_APPRV_DT = DNTL_UW_APPRV_DT 
    FROM EMPLOYER_ADDL AS ea 
    WHERE EXISTS 
    (
    SELECT 1 
     FROM EMP_PLAN_LINE_INFO AS ep 
     WHERE ep.GR_NBR = ea.GR_NBR 
     AND ep.LINE_CD = 50 
); 

Ancak, neden tablosunu güncelleştirmek? Görünüşe göre, bu, sürekli olarak çalışmanın riskini sürdürebilir.

+0

+1 - sabit güncellemelerde iyi bir noktaya değer veriyorum. – JNK

+2

sütun adını açıkça belirtmeniz gerekir. Şema gelecekte değişecekse ne olur? Yani 1 yerine bir sütun adı olmalı ... – Pankaj

+2

@StackOverflowUser - Bu örnek için önemli değil. '1' yi kullanıyor çünkü' 'EXISTS''' kısa devreleri ve biz aslında sahaya dönmeyiz. Tek bilmek istediğimiz, sıradaki durumu karşılayan bir satır mı var? – JNK

6

Bunun aynı sonucu vereceğine inanıyorum.

UPDATE ea 
    SET GTL_UW_APPRV_DT = DNTL_UW_APPRV_DT 
    FROM EMPLOYER_ADDL AS ea 
    INNER JOIN EMP_PLAN_LINE_INFO AS ep 
     ON ep.GR_NBR = ea.GR_NBR 
     AND ep.LINE_CD = 50 
+3

reddetme sebebi, lütfen yanlış yaptığımı öğrenebilirim. – AJP

+1

Vay, aynı cevabımız var, kim oy kullandı diye merak ediyorum. – SQLMason

+1

Her şey büyük bir oyun. – SQLMason

1

bir joker gerektirir. Bazıları daha yavaş olabileceğini savunuyorlar, ancak 2005'te SQL optimizerını buldum ve daha yüksek bir IN alanı, alan boş olmayan bir alan ise EXISTS ile aynı şekilde çalışıyor.

UPDATE EMPLOYER_ADDL 
SET EMPLOYER_ADDL.GTL_UW_APPRV_DT = EMPLOYER_ADDL.DNTL_UW_APPRV_DT 
WHERE EMPLOYER_ADDL.GR_NBR IN 
    ( 
     SELECT EMP_PLAN_LINE_INFO.GR_NBR 
     FROM EMP_PLAN_LINE_INFO 
     Where EMP_PLAN_LINE_INFO.LINE_CD = 50 
    ) 
+2

Hayır, 'EXISTS' joker karakter gerektirmez. Optimizer, sütun listesini tamamen yok sayar. –

+1

Nokta alındı. Gördüğüm örneklerin hepsi bir joker karaktere sahipti ama asla test etmedim. Cevabını sadece 1 seçtiğini fark ettim. – Brain2000

+1

SQL'deki joker karakter% değil * – SQLMason

2

Bunu da deneyin. Bence bu senin için yeni mi? GR_NBR EMP_Plan_line_Info bir PK ve farklı olduğunu varsayarsak

UPDATE ADDL 
SET ADDL.GTL_UW_APPRV_DT = ADDL.DNTL_UW_APPRV_DT 
From EMPLOYER_ADDL ADDL 
Inner Join EMP_PLAN_LINE_INFO INFO on INFO.GR_NBR = ADDL.GR_NBR 
Where INFO.LINE_CD = 50 
+1

FROM yok ve ADDL'ye ihtiyacınız yok. SET içinde ADDL.GTL_UW_APPRV_DT = – SQLMason

+1

nasıl oldu? :) Benim yanımda sessizce çalışıyor ... – Pankaj

+4

@DanAndrews şahsen, açık olmayı tercih ederim. Takma adın 'SET' satırına yerleştirilmesinde ne gibi bir zarar vardır? Takma adınızı okuyan meslektaşlarınız için, takma adın kesinlikle gerekli olmadığının farkında değilsiniz. Duyarlı takma adlar kullanırsanız, kodu daha iyi belgelemeye yardımcı olmalısınız, okumayı ve anlamayı daha hantal hale getirmemelidir. –

4

:

UPDATE EA 
SET  GTL_UW_APPRV_DT = DNTL_UW_APPRV_DT 
FROM EMPLOYER_ADDL EA 
     INNER JOIN EMP_PLAN_LINE_INFO EP 
      ON EP.GR_NBR = EA.GR_NBR 
       AND EP.LINE_CD = 50 
İlgili konular