2012-01-26 16 views
9

Próbuję napisać zapytanie, które aktualizuje datę tylko wtedy, gdy grupa im aktualizująca ma LINE_CD 50. Czy zrobiłbym to tak?Instrukcja SQL UPDATE z 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

Tak ............ – JNK

+1

Masz wiele "prawidłowych odpowiedzi" powodzenia wybierając jedną z im. – SQLMason

+1

Dziękuję wszystkim, naprawdę go aplikuję – user1152145

Odpowiedz

9

Co z tym?

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

Jedyny problem z tym związany to dodatkowa praca, jeśli sprzężenie powoduje duplikaty (np. Jeśli GR_NBR nie jest unikalny ani w EMPLOYER_ADDL ani EMP_PLAN_LINE_INFO). Wydaje mi się, że format EXISTS jest bezpieczniejszy, ponieważ uwzględnia oba scenariusze. YMMV. –

+1

GR_NBR nie jest unikalny w tabeli EPLI, ale jest w ADDL. Czy dodatkowe prace oznaczają, że zapytanie będzie trwało dłużej? – 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 
); 

Jednakże, jeśli można czerpać informacji z zapytaniem, dlaczego zaktualizować tabelę? Wydaje się, że to będzie musiało być prowadzone ciągle, ryzykując przestarzałością.

+0

+1 - dobry punkt na ciągłe aktualizacje. – JNK

+2

należy wyraźnie podać nazwę kolumny. Co się stanie, jeśli schemat zostanie zmieniony w przyszłości? Więc zamiast 1 powinna to być nazwa kolumny ... – Pankaj

+2

@StackOverflowUser - Nie będzie miało znaczenia dla tego wystąpienia. Używa zwarcia '1', ponieważ' EXISTS' i nie zwracamy pola. Chcemy tylko wiedzieć, czy wiersz spełnia wymieniony warunek? – JNK

6

Wierzę, że da to ten sam rezultat.

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

powód downvote proszę, więc mogę dowiedzieć się, co robię źle. – AJP

+1

Wow, mamy tę samą odpowiedź, zastanawiam się, kto będzie głosował. – SQLMason

+1

To wszystko wielka gra. – SQLMason

1

wierzę istnieje wymaga wieloznaczny:

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 
    ) 

wolę używania w choć. Niektórzy twierdzą, że może to być wolniejsze, ale znalazłem optymalizator SQL w 2005 r. I wyżej, że IN działa tak samo, jak EXISTS, jeśli pole jest polem innym niż NULL.

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

Nie, 'EXISTS' nie wymaga symboli wieloznacznych. Optymalizator całkowicie ignoruje listę kolumn. –

+1

Punkt wzięty. Wszystkie przykłady, jakie kiedykolwiek widziałem, mają symbol wieloznaczny, ale nigdy go dokładnie nie testowałem. Zauważyłem, że twoja odpowiedź po prostu wybiera 1. interesującą. – Brain2000

+1

Symbol wieloznaczny w języku SQL to% nie * – SQLMason

2

Wypróbuj również. Myślę, że to dla ciebie nowość?

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

Nie od, i nie potrzebujesz ADDL. w SET ADDL.GTL_UW_APPRV_DT = – SQLMason

+1

jak to się stało? :) Pracuje po mojej stronie w ciszy ... – Pankaj

+4

@DanAndrews osobiście wolę być jednoznaczny. Jaka szkoda jest w umieszczeniu aliasu w linii 'SET'? Jest to pomocne dla kolegów czytających Twój kod, którzy nie są świadomi, że alias nie jest koniecznie konieczny. Jeśli użyjesz rozsądnych aliasów, pomoże to lepiej udokumentować kod, a nie uczynić go bardziej uciążliwym do czytania i rozumienia. –

4

Zakładając, że GR_NBR jest PK i odrębne w 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