обновить и выбрать в одном запросе в MSSQL - PullRequest
0 голосов
/ 29 мая 2018

Можно ли выполнить обновление и выбрать в одном запросе в MSSQL

  id  │ item │ Amount  
 ═════╪══════╪════════ 
  123 │ anf  │ NULL    
  123 │ sh   │ 150     
  123 │ ab   │ NULL    
  123 │ fhy  │ NULL    
  123 │ fg   │ NULL    
  124 │ ab   │ NULL    
  124 │ sh   │ 650     
  125 │ ab   │ NULL    
  125 │ sh   │ 250     
  125 │ ab   │ NULL    
  126 │ ab   │ NULL    
  126 │ gh   │ NULL    
  126 │ sh   │ 10      

У меня разные идентификаторы и сумма доступна только там, где item = sh, и я хочу вывод, как показано ниже в одном запросе

  id  │ item │ Amount  
 ═════╪══════╪════════ 
  123 │ anf  │ 150     
  123 │ sh   │ 150     
  123 │ ab   │ 150     
  123 │ fhy  │ 150     
  123 │ fg   │ 150     
  124 │ ab   │ 650     
  124 │ sh   │ 650     
  125 │ ab   │ 250     
  125 │ sh   │ 250     
  125 │ ab   │ 250     
  126 │ ab   │ 10      
  126 │ gh   │ 10      
  126 │ sh   │ 10      

Ответы [ 6 ]

0 голосов
/ 29 мая 2018

Что-то, связанное с вашим вопросом, уже было размещено здесь, , чтобы увидеть его, нажмите здесь .

Пример:

Запрос на обновление:

UPDATE tblPopUp SET PopUp = 'False' WHERE DisplayNo = 1

Выберите запрос:

SELECT Period FROM tblPopUp WHERE DisplayNo = 1

Вот один из опубликованных ответов:

UPDATE tblPopUp  
SET PopUp = 'False', Period = Period  
OUTPUT DELETED.Period
WHERE DisplayNo = 1

Надеюсь, он вам помог.

0 голосов
/ 29 мая 2018

Если вы просто хотите выбрать суммы, вы можете использовать оконные функции:

select id, item, max(case when item = 'sh' then amount end) over (partition by id) as Amount
from t ;

Если вы хотите изменить данные, тогда вы используете update:

with toupdate as (
      select t.*, max(case when item = 'sh' then amount end) over (partition by id) as newAmount
      from t
     )
update toupdate
    set amount = newAmount
    where amount is null;

Я не вижу преимуществ в том, чтобы делать и то, и другое.Если вам нужно обновление и вы хотите, чтобы результаты были возвращены, выполните два запроса.

0 голосов
/ 29 мая 2018

Можно обновить и выбрать в одной инструкции, см. Предложение OUTPUT: http://www.sqlservercentral.com/articles/T-SQL/156604/

0 голосов
/ 29 мая 2018

Попробуйте:

SELECT t.id, t.item, sub.amount
FROM t
INNER JOIN
(
SELECT id, amount
FROM t
WHERE item = 'sh'
) sub
ON t.id = sub.id

Создайте производную таблицу, содержащую сумму для каждого идентификатора.Затем присоедините это к своему основному столу.

0 голосов
/ 29 мая 2018

Краткий ответ: Нет, вы не можете одновременно изменять данные, хранящиеся в таблицах (UPDATE), и представлять данные в таблицах (SELECT) в одном запросе.Вы можете сделать это в двух запросах и связать их в транзакции, чтобы убедиться, что они оба успешно или неудачно вместе.

Также для ясности, когда вы говорите ОБНОВЛЕНИЕ, вы имеете в виду обновить данные таблицы или выбрать их, а затем изменить их для запроса SELECT, но на самом деле не хранить эти данные в таблицах?

Такжепожалуйста, объясните логику того, как работает столбец return set-Amount.

Заранее спасибо.

0 голосов
/ 29 мая 2018

Использование Окно Функция:

select *, max(amount) over (partition by id) as NewAmount
from table t
where item = 'sh';

Для обновления вы можете использовать updatable cte:

with t as (
    select *, max(amount) over (partition by id) as NewAmount
    from table 
    where item = 'sh'
  )
update t
set amount = NewAmount
where amount is null;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...