Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在T-Sql的公共表表达式中使用IF-ELSE语句_Sql_Sql Server_Tsql_If Statement - Fatal编程技术网

在T-Sql的公共表表达式中使用IF-ELSE语句

在T-Sql的公共表表达式中使用IF-ELSE语句,sql,sql-server,tsql,if-statement,Sql,Sql Server,Tsql,If Statement,我创建了一个CTE,并尝试使用以下命令删除表。请注意,CTE表达式可以正常工作,但IF-ELSE语句不能正常工作 IF with FinalSales (time, terminal_id, count) as ( select time, terminal_id, count(*) from Final_Sales group by time, terminal_id having count(*) = 1 -- condition h

我创建了一个CTE,并尝试使用以下命令删除表。请注意,CTE表达式可以正常工作,但
IF-ELSE
语句不能正常工作

IF 
with FinalSales (time, terminal_id, count) as
(
    select time, terminal_id, count(*)
    from Final_Sales
    group by time, terminal_id
    having count(*) = 1             -- condition here
)

delete Sales
from FinalSales
inner join Sales
    on Sales.[time] = FinalSales.[time] 
    and Sales.terminal_id = FinalSales.terminal_id

ELSE IF 

  with FinalSales (time, terminal_id, count) as
  (
    select time, terminal_id, count(*)
    from Final_Sales
    group by time, terminal_id
    having count(*) > 1              -- Condition here
  )
  delete Sales
  from FinalSales
  inner join Sales
      on Sales.[time] = FinalSales.[time] 
      and Sales.terminal_id = FinalSales.terminal_id

   delete #temp1
   from FinalSales
   inner join #temp1
        on #temp1.[time] = FinalSales.[time] 
        and #temp1.terminal_id = FinalSales.terminal_id
在第一个
IF
语句中,当
count(*)=1
时,我删除一个表中的行,然后在
ELSEIF
语句中,当
count>1
时,我想删除两个表中的行。然而,我的方法不起作用

如何将其包装成
IF-ELSE
语句?或者还有其他方法可以做到这一点吗

整个查询结构简单

if count(*) == 1:
   delete Sales
else if count(*) > 1:
   delete Sales, #temp1
像这样的。我如何在t-sql中实现它


任何想法都将不胜感激

我认为这可能有效:

declare @count_of_duplicates int

set @count_of_duplicates = 

(select max(duplicate_count)
from
(       select time, terminal_id, count(*) as duplicate_count
        from Final_Sales
        group by time, terminal_id)  t1)
我们首先将参数设置为
count(*)
的最大值。如果存在重复项,则该值将大于1,否则如果没有重复项,则该值将为1

然后,我们可以开始我们的条件:

if @count_of_duplicates = 1

begin
with FinalSales (time, terminal_id, count) as
(
    select time, terminal_id, count(*)
    from Final_Sales
    group by time, terminal_id
)

delete Sales
from FinalSales
inner join Sales
    on Sales.[time] = FinalSales.[time] 
    and Sales.terminal_id = FinalSales.terminal_id
end

else if @count_of_duplicates > 1
begin
  with FinalSales (time, terminal_id, count) as
  (
    select time, terminal_id, count(*)
    from Final_Sales
    group by time, terminal_id
  )
  delete Sales
  from FinalSales
  inner join Sales
      on Sales.[time] = FinalSales.[time] 
      and Sales.terminal_id = FinalSales.terminal_id

   delete #temp1
   from FinalSales
   inner join #temp1
        on #temp1.[time] = FinalSales.[time] 
        and #temp1.terminal_id = FinalSales.terminal_id
end
我还没有机会分析它。。。让我知道它是否有效。

如果存在,为什么不使用(查询)


不能在纯SQL视图中完成。您必须在程序/包或脚本中执行此操作。@xQbert此语句最终将进入程序。您会问多少次相同的问题,而不提供需要某人回答的详细信息???这就是为什么您应该编辑您的问题,而不是到处散布详细信息的原因。如果我是一名顾问,我会很兴奋,因为你希望到处寻找你的细节。但作为一名自由志愿者,我只是没有它。第一个cte条件要么产生all
count(*)=1
,意味着没有重复项,要么产生一个大于1的数字,意味着有重复项,因此继续执行第二个语句,正确?在
集合
部分中意外地留下了
中的
语句。我们不需要它。当我运行代码时,我发现递归公共表表达式“FinalSales”不包含顶级UNION ALL运算符。我认为可能是我们首先使用了
max\u duplicatecount
。否。我明白问题是什么了。公共表表达式在声明后只能调用一次。FinalSales中的
delete#temp1
导致了问题。我会更新它,请稍等。我已经更新了它,请让我知道出现的任何其他情况。谢谢,我发现CTE名称应该不同。我在这里找到的。我使用了你编辑之前的版本。它起作用了!
IF exists (
    select time, terminal_id 
    from Final_Sales 
    group by time, terminal_id 
    having count(*) = 1
) begin
    --query
end else begin
    --query
end