Обновить несколько столбцов из подзапроса? - PullRequest
4 голосов
/ 19 января 2010

Как мне избежать дублирования подзапроса в следующем операторе T-SQL:

update r set
  column1=(select top 1 max(column1) from region r2 where (overlapping test conditions)),
  column2=(select top 1 max(column2) from region r2 where (overlapping test conditions))
from region r

По сути, у меня есть таблица, содержащая прямоугольные области. Для каждого перекрывающегося региона мне нужно установить в некоторых столбцах значения агрегации этого перекрывающегося региона.

Спасибо

РЕДАКТИРОВАТЬ: я добавляю слишком упрощенное условие перекрытия здесь:

(r.left >= r2.left and r.left < r2.right) or (r.right <= r2.right and r.right > r.left)

Дело в том, что в подзапросе будут указаны ссылки как на r, так и на r2. Кажется, что это идеальная ситуация для общего табличного выражения, но я не могу понять, как использовать его для каждой записи.

1 Ответ

1 голос
/ 19 января 2010
UPDATE Region
SET
  Region.Column1 = r.Column1
  Region.Column2 = r.Column2
FROM
  Region
INNER JOIN 
 (
   SELECT
        Column1,
        Column2
   FROM Region
   WHERE (your condition here)
  ) r ON r.ID = Region.ID

Я только что заметил MAX () aggs. Извините, не видел этого в первый раз. Возможно, вам понадобится два внутренних соединения, чтобы это работало ...

так возьми то, что у меня есть, и сделай это для column1

INNER JOIN (SELECT MAX(Column1) FROM ... WHERE ... ) r ON r.ID = Region.ID 

Затем второй INNER JOIN

INNER JOIN (SELECT MAX(Column2) FROM ... WHERE ...)r2 ON r2.ID = Region.ID   

И ваше обновление становится

UPDATE Region
SET Region.Column1 = r1.Column1,
    Region.Column2 = r2.Column2
FROM Region
INNER JOIN
(SELECT MAX(Column1) as Column1 FROM ... WHERE ... ) r ON r.ID = Region.ID
INNER JOIN
(SELECT MAX(Column2) As Column2 FROM ... WHERE ... ) r2 ON r2.ID = Region.ID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...