2012-01-26 208 views
9

我試圖編寫一個查詢來更新一個日期,只有當組更新時LINE_CD是50.我會這樣做嗎?SQL UPDATE語句與WHERE EXISTS

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

是............ – JNK

+1

你有很多 「正確的答案」 好運選擇之一他們。 – SQLMason

+1

謝謝大家,我真的很喜歡 – user1152145

回答

9

這是怎麼回事?

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

如果連接產生重複項(例如,如果GR_NBR在EMPLOYER_ADDL或EMP_PLAN_LINE_INFO中不唯一),唯一的問題是額外的工作。我認爲EXISTS格式更安全,因爲它迎合了這兩種情況。因人而異。 –

+1

GR_NBR在EPLI表中不唯一,但在ADDL中。通過額外的工作,你是否意味着查詢需要更長時間才能運行? – 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 
); 

但是,如果你可以從查詢得到這個信息,爲什麼更新表?似乎這將不得不經常運行,否則風險會過時。

+0

+1 - 不斷更新的好處。 – JNK

+2

你應該明確地提到列名。如果模式將來發生變化會怎樣?所以,而不是1它應該是一個列名... – Pankaj

+2

@StackOverflowUser - 這對此實例無關緊要。他使用'1'是因爲'EXISTS'短路,而我們實際上並沒有返回該字段。我們想知道的是,連續滿足列出的條件? – JNK

6

我相信這會給你同樣的結果。

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

downvote請原因,所以我可以瞭解我做錯了什麼。 – AJP

+1

哇,我們有同樣的答案,我不知道誰投了票。 – SQLMason

+1

這是一場大型的比賽。 – SQLMason

1

我相信存在需要通配符:

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 
    ) 

我更喜歡使用在思想上。有些人認爲它可能會變慢,但我發現SQL優化器在2005年及更高版本中使IN與EXISTS一樣工作,如果該字段爲非空字段。

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

不,「EXISTS」不需要通配符。優化器完全忽略列列表。 –

+1

已採取的措施。我見過的所有存在的例子都有一個通配符,但我從來沒有徹底測試過它。我注意到你的答案只是選擇1 ..有趣。 – Brain2000

+1

SQL中的通配符是%not * – SQLMason

2

試試這個吧。我認爲這對你來說是新的?

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,你不需要ADDL。在SET ADDL.GTL_UW_APPRV_DT = – SQLMason

+1

這是怎麼回事? :)它無聲無息地在我身邊工作...... – Pankaj

+4

@DanAndrews個人,我更喜歡明確。將別名放在「SET」行中會有什麼危害?對於讀取代碼的同事來說,這些代碼並不知道別名不是絕對必要的,這對我們有所幫助。如果你使用明智的別名,它應該有助於更好地記錄代碼,而不是使它更難以閱讀和理解。 –

4

假設GR_NBR是EMP_Plan_line_Info一個PK和獨特的:

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