繁体   English   中英

如何从 sql 中删除结果查询?

[英]How to delete result query from sql?

我想删除这个结果表单数据库。请帮帮我。

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

如果您使用的是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

如果您使用 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)

您可以使用这个标准的 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
    )

您可以简单地使用 DELETE 如下所示 DELETE a FROM #stock_batch 作为 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

如果您只想保留每个库存的最新批次,我建议您使用以下方法之一:

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)上的索引。 但是,如果您要删除许多行,这可能仍然很慢。 在这种情况下,还有其他可能更快的方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM