2012-01-26 17 views
9

Sto cercando di scrivere una query che aggiorna una data solo se l'aggiornamento di gruppo ha un LINE_CD di 50. Lo farei in questo modo?Istruzione SQL UPDATE con 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

Sì ............ – JNK

+1

Avete molte "risposte giuste" in bocca al lupo, selezionando una delle loro. – SQLMason

+1

Grazie a tutti, lo appaggo davvero su – user1152145

risposta

9

Che dire di questo?

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

L'unico problema con questo è un lavoro extra se il join produce duplicati (ad esempio se GR_NBR non è univoco in EMPLOYER_ADDL o EMP_PLAN_LINE_INFO). Penso che il formato EXISTS sia più sicuro perché soddisfa entrambi gli scenari. YMMV. –

+1

GR_NBR NON è univoco nella tabella EPLI ma è in ADDL. Per lavoro extra intendi che la query impiegherà più tempo per essere eseguita? – 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 
); 

Tuttavia, se è possibile ricavare queste informazioni da una query, il motivo per cui aggiornare la tabella? Sembra che questo dovrà essere eseguito costantemente altrimenti rischiano di essere obsoleti.

+0

+1 - buon punto sugli aggiornamenti costanti. – JNK

+2

dovresti menzionare esplicitamente il nome della colonna. Cosa succede se lo schema è cambiato in futuro? Quindi invece di 1 dovrebbe essere un nome di colonna ... – Pankaj

+2

@StackOverflowUser - Non ha importanza per questa istanza. Sta usando '1' perché i cortocircuiti di' EXISTS' e in realtà non restituiscono il campo. Tutto ciò che vogliamo sapere è che una riga soddisfa le condizioni elencate? – JNK

6

Credo che questo ti darà lo stesso risultato.

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

motivo per downvote per favore così posso imparare cosa sto facendo di sbagliato. – AJP

+1

wow, abbiamo la stessa risposta, mi chiedo chi ha votato. – SQLMason

+1

È tutto un grande gioco. – SQLMason

1

credo esista richiede un jolly:

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 
    ) 

Io preferisco usare IN però. Alcuni sostengono che può essere più lento, ma ho trovato l'ottimizzatore SQL nel 2005 e più in alto rendono IN lavoro lo stesso di EXISTS se il campo è un campo non nullo.

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

No, 'EXISTS' non richiede un carattere jolly. L'ottimizzatore ignora completamente l'elenco di colonne. –

+1

Punto preso. Tutti gli esempi che ho mai visto hanno un carattere jolly ma non l'ho mai testato a fondo. Ho notato che la tua risposta fa solo una selezione 1 .. interessante. – Brain2000

+1

Il carattere jolly in SQL è% non * – SQLMason

2

Provare anche con questo. Penso che questo sia nuovo per te?

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

No FROM e non è necessario ADDL. in SET ADDL.GTL_UW_APPRV_DT = – SQLMason

+1

come mai? :) Sta funzionando il mio lato in silenzio ... – Pankaj

+4

@DanAndrews personalmente, preferisco essere esplicito. Che danno c'è nel mettere l'alias nella riga 'SET'? È utile per i colleghi che leggono il tuo codice che non sono a conoscenza che l'alias non è strettamente necessario. Se si utilizzano alias sensibili, questo dovrebbe aiutare a documentare meglio il codice, non renderlo più ingombrante da leggere e capire. –

4

Supponendo che GR_NBR è un PK e distinto in EMP_Plan_line_Info:

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