2015-01-12 2 views
0

У меня есть комплекс (*) SQL SELECT заявления, которое возвращает строки, которые мне нужно, чтобы обновитьОбновление строк, возвращаемый ЗЕЬЕСТ

Как обновить строки, возвращенные только моего SELECT заявления?

Все сообщения я вижу об обновлении строк с помощью оператора SELECT говорить о INNER JOIN против другой таблицы с помощью полей, чтобы соответствовать (How do I UPDATE from a SELECT in SQL Server?)

Мое утверждение

SELECT * FROM table1 I 
INNER JOIN 
(SELECT * 
    FROM (
       SELECT INTNO,EFFDTE, 
         ROW_NUMBER() OVER(PARTITION BY INTNO,EFFDTE ORDER BY EFFDTE DESC) rn 
        FROM table2 WHERE REFID = 8888 AND EFFDTE IS NOT NULL AND INTNO <> 1234567 
      ) a 
WHERE rn = 1) X 
ON X.INTNO = I.MEMBNO AND I.ENDDTE = DATEADD(DD,-1,X.EFFDTE) 
WHERE I.ENDRSN = 'abc' 

ответ

1

Используйте этот синтаксис

UPDATE a 
SET a.col1 = b.col1, 
     a.col1 = b.col2 
     ..... 
     ..... 
FROM update_table a 
     JOIN(SELECT * 
      FROM table1 I 
        INNER JOIN (SELECT INTNO, 
             EFFDTE, 
             Row_number() 
             OVER(
              PARTITION BY INTNO, EFFDTE 
              ORDER BY EFFDTE DESC) rn 
           FROM table2 
           WHERE REFID = 8888 
             AND EFFDTE IS NOT NULL 
             AND INTNO <> 1234567) X 
          ON X.INTNO = I.MEMBNO 
           AND I.ENDDTE = Dateadd(DD, -1, X.EFFDTE) 
      WHERE I.ENDRSN = 'abc' 
        AND rn = 1) b 
     ON a.common_colum = b.common_colum 
+0

Благодарю. Что произойдет, если у меня нет общего столбца? т.е.: значение, которое появляется только в моих возвращенных строках из моей инструкции SELECT? Оператор SELECT может возвращать 3 из 10 строк с INTNO 111222, но я хочу только обновить их 3, не все 10 – Mike

+0

@Mike, то как определить, какая строка будет обновляться –

+0

Спасибо @NoDisplayName - я понял, что моя инструкция SELECT Это был ответ. Я пытался подключиться ко всему моему запросу select к обновлению, тогда как мне нужно было немного отступить и использовать обновление против него. (Я добавил ответ) – Mike

0

Попробуйте это

Update table1 
set Col_Name=Value 
FROM table1 I 
INNER JOIN 
(SELECT * 
    FROM (
       SELECT INTNO,EFFDTE, 
         ROW_NUMBER() OVER(PARTITION BY INTNO,EFFDTE ORDER BY EFFDTE DESC) rn 
        FROM table2 WHERE REFID = 8888 AND EFFDTE IS NOT NULL AND INTNO <> 1234567 
      ) a 
WHERE rn = 1) X 
ON X.INTNO = I.MEMBNO AND I.ENDDTE = DATEADD(DD,-1,X.EFFDTE) 
WHERE I.ENDRSN = 'abc' 
+0

Добро пожаловать в переполнение стека, это не ответ. Вы можете добавить это как комментарий, пожалуйста, до тех пор, пока вы не получите хотя бы 50 репутации на этом сайте для комментариев. –

+0

- этот ответ. пожалуйста, проверьте –

+0

** Пожалуйста, проверьте еще раз, я поместил некоторый текст ** –

0

Это вопрос подхода и понимания того, как наилучшим образом подходить к SQL-запросам.

мне не нужно, чтобы присоединиться ко всему ВЫБРАТЬ я построил, мне просто нужно заменить SELECT, с целью UPDATE таким образом, чтобы присоединиться к обновлению использует логику (и общие столбцы)

UPDATE table1 
SET field1 = 'MP', field2 = NULL 
FROM 
table1 I JOIN 
(SELECT * 
    FROM (
       SELECT INTNO,EFFDTE, 
         ROW_NUMBER() OVER(PARTITION BY INTNO,EFFDTE ORDER BY EFFDTE DESC) rn 
        FROM table2 WHERE REFID = 8888 AND EFFDTE IS NOT NULL AND INTNO <> 1234567 
      ) a 
WHERE rn = 1) X 
ON X.INTNO = I.MEMBNO AND I.ENDDTE = DATEADD(DD,-1,X.EFFDTE) 
WHERE I.ENDRSN = 'abc' 
Смежные вопросы