Как удалить результат запроса из sql? - PullRequest
0 голосов
/ 27 сентября 2019

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

select *
FROM          stock_batch AS a
INNER JOIN     
(
    SELECT    stockid, Max(batchid) AS batchid
    FROM      stock_batch
    GROUP BY  stockid
) AS b
ON            a.stockid = b.stockid
AND           a.batchid < b.batchid

Ответы [ 5 ]

0 голосов
/ 27 сентября 2019

Если вы хотите сохранить только самую последнюю партию для каждого запаса, я бы порекомендовал один из следующих:

with todelete as (
      select sb.*,
             row_number() over (partition by stockid order by batchid desc) as seqnum
      from stock_batch sb
     )
delete from todelete
    where seqnum = 1;

Или:

delete sb from stock_batch sb
    where sb.batchid < (select max(sb2.batchid)
                        from stock_batch sb2
                        where sb.stockid = sb2.stockid
                       );

Оба из них могут занятьпреимущество индекса на stock_batch(stockid, batchid).Однако, если вы удаляете много строк, это все равно может быть медленным.В этом случае есть другие подходы, которые могут быть быстрее.

0 голосов
/ 27 сентября 2019

Вы можете просто использовать DELETE, как показано ниже УДАЛИТЬ ИЗ #stock_batch В КАЧЕСТВЕ ВНУТРЕННЕГО СОЕДИНЕНИЯ
(ВЫБЕРИТЕ stockid, Max (batchid) КАК Batchid ИЗ #stock_batch GROUP BY stockid) AS b ON a.stockid = b.stockid ANDa.batchid

0 голосов
/ 27 сентября 2019

Если вы используете SQL SERVER, вы можете сделать это с помощью CTE, как показано ниже.

WITH CTE AS(
     select *
     FROM stock_batch AS a
     INNER JOIN     
     (
        SELECT    stockid, Max(batchid) AS batchid
        FROM      stock_batch
        GROUP BY  stockid
     ) AS b
     ON            a.stockid = b.stockid
     AND           a.batchid < b.batchid)

     delete from stock_batch WHERE STOCKid IN(SELECT stockid FROM CTE)
0 голосов
/ 27 сентября 2019

Вы можете использовать этот стандартный скрипт удаления dml

DELETE 
FROM stock_batch
WHERE stockid in 
    (select stockid from 
        (select a.stockid
            FROM          stock_batch AS a
            INNER JOIN     
            (
            SELECT    stockid, Max(batchid) AS batchid
            FROM      stock_batch
            GROUP BY  stockid
            ) AS b
            ON a.stockid = b.stockid
            AND a.batchid < b.batchid
        ) as t1
    )
0 голосов
/ 27 сентября 2019

Если вы используете sql server, вы можете сделать, как показано ниже.Просто замените SELECT * на DELETE a.Примечание: a - это псевдоним, который вы использовали для таблицы.

DELETE a
FROM          stock_batch AS a
INNER JOIN     
(
    SELECT    stockid, Max(batchid) AS batchid
    FROM      stock_batch
    GROUP BY  stockid
) AS b
ON            a.stockid = b.stockid
AND           a.batchid < b.batchid
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...