【问题标题】:Would like to delete results from SQL Select Query想要从 SQL 选择查询中删除结果
【发布时间】:2013-06-06 16:04:38
【问题描述】:

我想从 SQL 查询中删除结果。

这是查询。

SELECT Name.ID, Name.FULL_NAME, Name.CHAPTER, Subscriptions.BEGIN_DATE, Name.MEMBER_TYPE, Subscriptions.PRODUCT_CODE
FROM   test.dbo.Name Name INNER JOIN test.dbo.Subscriptions Subscriptions ON (Name.ID=Subscriptions.ID) AND (Name.BT_ID=Subscriptions.BT_ID)
WHERE  Name.MEMBER_TYPE='DUPE'
ORDER BY Name.ID

这是我正在使用的 Microsoft 版本:

  • 微软视窗 7
  • SQL Server Management Studio 2012 11.0.3
  • 操作系统 6.1.7601

提前感谢您的支持。

【问题讨论】:

  • 不是一个小问题,他要求从两个表中删除行
  • 您是否要删除名称和订阅中的两个条目。如果只有一张桌子,是哪一张?
  • A DELETE 在任何时候只能影响单个表,除非存在正确设置了级联操作的外键约束。您是要从一个表中删除还是从两个表中删除?
  • 希望删除订阅表中的条目。

标签: sql sql-server windows-server-2012


【解决方案1】:

您似乎正在通过 (ID, BT_ID) 对来识别行。将其存储在表变量中:

declare @to_delete (id int, bt_id int);
insert  @to_delete
select  n.id
,       n.bt_id
from    Subscriptions s
join    Name n
on      n.id = s.id
        and n.bt_id = s.bt_id
where   n.member_type = 'DUPE'

然后从两个表中删除:

delete  s
from    Subscriptions s
join    @to_delete td
on      td.id = s.id
        and td.bt_id = s.bt_id

delete  n
from    Name n
join    @to_delete td
on      td.id = n.id
        and td.bt_id = n.bt_id

【讨论】:

    【解决方案2】:

    最后一个答案在正确的轨道上,但可以更简单

    SELECT Name.ID, Name.BT_ID
    INTO #dump
    FROM Name Name 
    INNER JOIN Subscriptions Subscriptions 
       ON (Name.ID=Subscriptions.ID) AND (Name.BT_ID=Subscriptions.BT_ID)
    WHERE  Name.MEMBER_TYPE='DUPE'
    
    delete s from subscriptions s join #dump t on t.BT_ID = s.BT_ID and t.ID = s.ID
    delete n from from Name n join #dump t on t.BT_ID = n.BT_ID and t.ID = n.ID
    

    没有理由声明临时表,只需使用 select 仅在范围内创建它,完成后该表就会消失。容易。

    【讨论】:

    • 谢谢。非常感谢!
    猜你喜欢
    • 2021-04-01
    • 1970-01-01
    • 2016-07-03
    • 2019-01-01
    • 2014-10-15
    • 2012-01-03
    • 2019-10-14
    • 2014-06-06
    • 1970-01-01
    相关资源
    最近更新 更多