2016-08-07 5 views
0

Это мой запрос, и я точно знаю, в чем проблема. Он возвращает более одного столбца из своего внутреннего оператора select, пока он будет обновлять только один столбец. Точка - это второй столбец для условия. Как я могу достичь своей цели? Есть ли какой-либо конкретный синтаксис sql.Решение сложного подзапроса sql

update xaddress B set (B.xrank)= 
(select a.x1001olcsrl,row_number() over(partition by a.x1001olcsrl order by a.x1001olcsrl) as rnk 
from xaddress a) 
where x1001olcsrl=B.x1001olcsrl 
+1

Это было бы проще [с помощью 'merge'] (http://stackoverflow.com/a/38790076/266304). Вы уверены, что хотите сохранить/сохранить этот рейтинг - почему бы не иметь представление оболочки, которое генерирует его на лету? –

+0

Было бы проще, если бы вы объяснили, что вы связываете. Внутренний запрос не имеет смысла: выберите столбец и номер строки, где вы разбиваете и заказываете один и тот же столбец? что это должно делать? Что он делает, если нет дубликатов, он всегда будет возвращать 1; и если они есть, он вернет более одной строки для каждого дублированного значения x1001olcsrl, а ошибка (даже если вы используете MERGE, правильное решение) будет заключаться в том, что в подзапросе слишком много ROWS, а не слишком много столбцов. – mathguy

+0

@alex Я согласен с вами, но это может быть выполнено каждое обновление, возможно, с помощью триггера, если решающее значение имеет решающее значение. – Bohemian

ответ

0

Чтобы добавить только один столбец, вам нужно добавить еще один дополнительный запрос. Замените «Значение» на исходное значение.

для однострочного обновления.

update xaddress 
set xrank = (Select rnk from (select a.x1001olcsrl,row_number() over(partition by a.x1001olcsrl order by a.x1001olcsrl) as rnk 
      from xaddress) where x1001olcsrl= 'Value') 
where x1001olcsrl= 'Value' 

для всего обновления таблицы.

With CTE As 
(
select x1001olcsrl,row_number() over(partition by x1001olcsrl order by x1001olcsrl as rnk 
from xaddress 
) 
update xaddress 
SET xrank = rnk 
FROM xaddress a 
INNER JOIN CTE b ON a.x1001olcsrl = b.x1001olcsrl 
+0

Кажется, что нужно обновить все строки в таблице, а не за одно значение; но по мере дублирования значения подзапрос по-прежнему будет возвращать несколько строк. Вам нужно будет сопоставить уникальные столбцы (или rowid). –

+0

Хорошо, поэтому мы применим с CTE –

0

Использование MERGE, что версия оракула из-обновление с присоединиться:

MERGE INTO xaddress a 
USING (select 
     x1001olcsrl, 
     row_number() over(partition by x1001olcsrl order by x1001olcsrl) rnk 
     from xaddress) x 
ON x.x1001olcsrl = a.x1001olcsrl 
WHEN MATCHED THEN UPDATE 
SET xrank = rnk 
+0

Это имеет смысл для вас? Выберите x100 .... и row_number, секционированные и упорядоченные по тому же x100 ....? Что это даст? Я указал это в комментарии девять часов назад. – mathguy

Смежные вопросы