2017-01-19 2 views
-1

У меня есть таблица, которая является «Запасами». Внутри этой таблицы есть тысячи записей, и мне нужно ОБНОВИТЬ его в соответствии с. к следующему примеру. (Я использую SQL Server 2008)Как обновить таблицу с помощью подзапроса

STOCKS.stock_name  STOCKS.a_id 
A.001     0 
B.001     0 
C.001     20 
A.002     0 
B.002     10 
A.003     0 

После выполнения кода, я хочу, чтобы иметь таблицу, которая, как:

STOCKS.stock_name  STOCKS.a_id 
A.001     20 
B.001     20 
C.001     20 
A.002     10 
B.002     10 
A.003     0 

Что должно произойти здесь в том, что SQL понимает, 001 - 002 и 003 - 3 разные группы. (Я думаю об использовании SUBSTRING (stock_name, 3,20), так как первые 2 части моего текстового значения не будут похожи на «AA.002». Группировка начнется с третьей части каждого названия запаса.) выбирает значение a.id и обновляет строки соответственно. Мне очень нужна ваша помощь по этой проблеме.

Большое спасибо заранее!

+0

Вы должны пометить свой вопрос в базе данных, которую используете. –

+0

Привет, Гордон, Большое спасибо за ваш комментарий. Я отредактировал свой вопрос thansk для вас. –

ответ

0

Это то, что вы хотите?

update stocks s 
    set id = (select max(s2.id) from stocks s2 where substring(s2.stock_name, 3, 20) = substring(s.stockname, 3, 20) 
       ) 
    where s.id = 0; 
+0

Привет, Гордон, Большое спасибо за ваши отзывы. Однако это не сработало. Я предполагаю, что вы хотели, чтобы я выполнил следующий код (если я ошибаюсь, пожалуйста, исправьте меня): –

+0

Обновить запасы установить a.id = (выберите max (T1.a_id) из запасов, когда T1 оставил внешнее соединение Акциями как T2 на T1 .a_RECno = T2.a_RECno где substring (T1.a_id, 3, 20) = подстрока (T2.a_id, 3, 20)) где a_id = 0 –

+0

Причина, по которой я изменил ваш код, как указано выше, заключается в том, что я не конечно, если я могу ввести код вроде: update t set a.id = (выберите max (a.id) из t t2 [Что вы подразумеваете под «t t2»] Я подумал, может быть, вы пытались сказать мне, что я должен ссылаться на таблицу репликации, и поэтому я присоединился к той же таблице, что и T2, но это не сработало. Как я уже сказал, все восстановленные были обновлены, а a_id был установлен как максимальная сумма из соответствующего столбца. –

0

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

-- Your example data for demonstration purposes. 
CREATE TABLE #STOCKS (stock_name nvarchar(5), a_id int) 
INSERT INTO #STOCKS (stock_name, a_id) VALUES ('A.001', 0) 
INSERT INTO #STOCKS (stock_name, a_id) VALUES ('B.001', 0) 
INSERT INTO #STOCKS (stock_name, a_id) VALUES ('C.001', 20) 
INSERT INTO #STOCKS (stock_name, a_id) VALUES ('A.002', 0) 
INSERT INTO #STOCKS (stock_name, a_id) VALUES ('B.002', 10) 
INSERT INTO #STOCKS (stock_name, a_id) VALUES ('A.003', 0) 

-- To capture the stock name fragments, and the maximum value for each name fragment. 
DECLARE @StockValues TABLE (stock nvarchar(5), stockNameFrag nvarchar(5), stockValue int) 
DECLARE @StockMaxValues TABLE (stockNameFrag nvarchar(5), stockMaxValue int) 

-- Data captured in this variable gets used in the next subquery. 
INSERT INTO @StockValues (stock, stockNameFrag, stockValue) 
SELECT s.stock_name, SUBSTRING(s.stock_name, 3, 20), s.a_id 
FROM #STOCKS s 
ORDER BY s.a_id DESC 

-- Now extract the maximum value for each name fragment in @StockValues. 
INSERT INTO @StockMaxValues 
SELECT sv1.stockNameFrag, MAX(sv2.MaxValue) 
FROM @StockValues sv1 
     INNER JOIN (
      SELECT stockNameFrag, MAX(stockValue) AS MaxValue 
      FROM @StockValues 
      GROUP BY stockNameFrag 
      ) sv2 ON sv1.stockNameFrag = sv2.stockNameFrag AND sv1.stockValue = sv2.MaxValue 
GROUP BY sv1.stock, sv1.stockNameFrag 

-- Store results you want 
DECLARE @Stock TABLE (stock nvarchar(5), stockMaxValue int) 
INSERT INTO @Stock (stock, stockMaxValue) 
SELECT s.stock_name, smv.stockMaxValue 
FROM #STOCKS s 
     INNER JOIN @StockMaxValues smv ON smv.stockNameFrag = SUBSTRING(s.stock_name, 3, 20) 

-- Now update the #STOCKS table with the max value for each stock. 
UPDATE s1 
SET  s1.a_id = s2.stockMaxValue 
FROM #STOCKS s1 
     INNER JOIN @Stock s2 ON s1.stock_name = s2.stock 

SELECT * FROM #STOCKS 

-- Cleanup from the demo table. 
DROP TABLE #STOCKS 
+0

Hello Кен. Большое спасибо за ваш вклад. Я использовал ваш код, чтобы убедиться, что он работает. что мне пришла в голову другая идея, за которую я очень ценю. Был ли ваш код не работает или я допустил ошибку. Прежде всего, я ожидал, что UPDATE будет в конце вашего кода. Но UPDATE не было. Полагаю, вы хотели, чтобы я справился с остальными :) Но в любом случае ваш вклад позволил мне еще раз поблагодарить вас! Я расскажу об этом ниже. –

+0

Добро пожаловать в Baris. Вы правы, я изначально не применял обновление к этому решению. Он теперь переработан, так что он обновит таблицу #STOCKS. Я добавил переменную таблицы (@Stock) и инструкцию UPDATE. Благодарю. –

0

Это обновит stock_name

UPDATE s 
SET s.a_id = (
     SELECT MAX(a_id) 
     FROM Stocks 
     WHERE SUBSTRING(stock_name, 3, 20) = SUBSTRING(s.stock_name, 3, 20) 
) 
FROM Stocks s 
WHERE SUBSTRING(s.stock_name, 3, 20) = '001' 
+0

Большое спасибо за ваш ответ. Однако этот код будет обновлять только те названия акций, которые заканчиваются на '001'. Тем не менее, если я удалю условие where, которое находится в конце кода, код изменит весь столбец s.a_id и установит его как максимальное значение из таблицы. В нашем случае все значения превратятся в 20, поскольку это максимальное значение. –

0

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

DECLARE @MAXPRIM table (StockNameFrag nvarchar(20), StockValue int) 


INSERT INTO @MAXPRIM(StockNameFrag, StockValue) 
SELECT SUBSTRING(stock_name,3,20), Max(a_id) 
FROM Stocks 
Group By SUBSTRING(stock_name,3,20) 

UPDATE STOCKS 
set a_id = (select StockValue from @MAXPRIM where StockNameFrag =SUBSTRING(stock_name,3,20)) 
0

Если вы хотите обновить все строки, то запрос ниже должен работать.

UPDATE s 
SET s.a_id = b.max_value 
FROM Stocks s 
JOIN (
    SELECT SUBSTRING(stock_name, 3, 20) AS 'stock_name', MAX(a_id) 'max_value' 
    FROM Stocks s 
    GROUP BY SUBSTRING(s.stock_name, 3, 20) 
) b on b.stock_name = SUBSTRING(s.stock_name, 3, 20)