【问题标题】:Delete only one item from table with multiple similar items从具有多个相似项目的表中仅删除一项
【发布时间】:2013-01-11 03:24:41
【问题描述】:

我想知道,我是否可以执行这样的操作。我在表中有以下数据排列:

id SessionId P_Name P_TypeId
1  abc        XYZ   5
2  abc        XYZ   5
3  abc        XYZ   5
4  abc        XYZ   5
5  abc        XYZ   5
6  abc        XYZ   5
7  abc        XYZ   5  
8  abc        XYZ   5

这里我有 8 个相似的项目,但有唯一的 ID。

条件:

从前端我将传递[P_TypeId] = 5,然后查询将使用删除语句从表中仅删除一项。 这可能吗?

【问题讨论】:

  • 什么是5,是ID还是P_Typeid?
  • @Kiran1016 查看更新后的问题,其 TypeId

标签: c# asp.net sql tsql sql-server-2008-r2


【解决方案1】:

是的,例如使用ROW_NUMBER

WITH x 
     AS (SELECT id, 
                sessionid, 
                p_name, 
                p_typeid, 
                RN = Row_number() 
                       OVER( 
                         partition BY sessionid, p_name, p_typeid 
                         ORDER BY id) 
         FROM   dbo.tablename
         WHERE P_TypeId = @P_TypeId ) 
DELETE x 
WHERE  rn = 1 

删除每个组的最低 id。

DEMO

【讨论】:

    【解决方案2】:
    delete top(1) from mytable where p_typeid = 5
    

    上面将删除包含 p_typeid 为 5 的一行。

    如果要删除 id 最低的行,请尝试

     with t as (
       select top(1) * from mytable where p_typeid = 5
       order by id
     )
     delete from t
    

    【讨论】:

      【解决方案3】:

      你可以这样做:

      delete from dbo.your_tablename 
      where id = (select top 1 id from dbo.your_tablename where P_TypeId = 5)
      

      虽然感觉有点像 hack。

      正如其他答案所做的那样,如果需要,您还可以在 select top... 查询中添加 where 子句。

      【讨论】:

        猜你喜欢
        • 2019-03-22
        • 2021-03-15
        • 1970-01-01
        • 2019-01-05
        • 1970-01-01
        • 1970-01-01
        • 2020-12-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多