首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用join从CTE删除

使用join从CTE删除
EN

Stack Overflow用户
提问于 2014-03-31 20:48:55
回答 3查看 19.4K关注 0票数 13

我正在尝试使用sql表实现一个FIFO队列。

我有以下SQL (为发布而修改),连接和参数的使用对这个过程的工作方式很重要。

代码语言:javascript
复制
With cte as (
   select top(1) q.* from queue q with (readpast)
   inner join MyTable a on q.id = a.myTableID AND myTable.procID = @myParam
   order by q.Data asc
)
delete from cte
    output
      deleted.ID,
      deleted.col1

运行此语句将返回错误'View or function 'cte‘不可更新,因为修改会影响多个基表。’

我理解抛出错误的原因,但我不明白的是如何修复它。任何建议都将不胜感激!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-03-31 21:34:56

您可以在CTE中使用exists()而不是MyTable的内连接。

代码语言:javascript
复制
with cte as 
(
  select top(1) q.id,
                q.col1
  from queue q with (readpast)
  where exists(
              select *
              from  MyTable a 
              where  q.id = a.myTableID AND 
                     a.procID = @myParam
              )
  order by q.Data asc
)
delete from cte
output deleted.ID, deleted.col1;
票数 25
EN

Stack Overflow用户

发布于 2014-03-31 20:52:20

像这样的东西?

代码语言:javascript
复制
With cte as (
   select top(1) q.* from queue q with (readpast)
   inner join MyTable a on q.id = a.myTableID AND myTable.procID = @myParam
   order by q.Data asc
)
delete from queue
Where ID in (Select Id from cte)
票数 6
EN

Stack Overflow用户

发布于 2014-03-31 21:45:31

在这里,CTE的使用感觉是被迫的。您可以简单地:

代码语言:javascript
复制
 DELETE FROM [queue]
  WHERE id IN ( 
    SELECT TOP 1 
           q.id 
      FROM [queue] q WITH (READPAST)
           INNER JOIN 
           MyTable a ON q.id = a.myTableID 
                    AND myTable.procID = @myParam
    ORDER BY q.Data ASC)

如果你想使用CTE,我喜欢@sarin的答案,但是使用EXIST:

代码语言:javascript
复制
WITH cte AS (
  SELECT TOP 1 
         q.id 
    FROM [queue] q WITH (READPAST)
         INNER JOIN 
         MyTable a ON q.id = a.myTableID 
                  AND myTable.procID = @myParam
   ORDER BY q.Data ASC
)
DELETE [queue] 
 WHERE EXISTS(SELECT 1 FROM cte WHERE cte.id = [queue].id)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22761972

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档