2017-10-25 7 views
0

CTEが作成されていますが、次のようにテーブルを削除しようとしています。 CTE式は正常に動作しますが、IF ELSEステートメントはそうではありません。私は2つのテーブル内の行を削除したいときcount > 1count(*) = 1が、その後I ELSEIF声明の中で、その後1テーブル内の行を削除し、第1 IFの文では、T-SQLの共通テーブル式で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 ELSEステートメントにはどのように記述できますか?またはこれを行うための他の方法がありますか?シンプルな構造で

全体のクエリ、このような

if count(*) == 1: 
    delete Sales 
else if count(*) > 1: 
    delete Sales, #temp1 

何か。 t-sqlでどうすればいいですか?

すべてのアイデアをいただければ幸いです。

+0

ビューとして純粋なPure SQLで行うことはできません。プロシージャ/パッケージまたはスクリプトでこれを行う必要があります。 – xQbert

+0

@xQbert最後に、​​これらのステートメントは手順に入ります。 –

+0

あなたは何回同じ質問をして、誰かが答えるために必要な細部を提供しないでしょうか? –

答えて

1

私は、これはうまくいくかもしれないと思う:

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 

をそれを解析する機会...それが動作するかどうか私に教えてください。

+0

'set'部分に' having'ステートメントを残しました。私たちはそれを必要としません。 – Simon

+0

コードを実行すると、 '再帰的な共通テーブル式 'FinalSales'にはトップレベルのUNION ALL演算子が含まれていません。'私たちは最初に 'max_duplicatecount'を取るかもしれないと思います。 –

+0

いいえ、問題の内容を確認します。共通テーブル式は宣言後に一度だけ呼び出されることがあります。 'Delete#temp1 from finalSales'が原因です。私はそれを更新し、私に瞬間を与えます。 – Simon

0

存在(クエリ)が存在する場合、なぜ使用しないのですか?

IF exists (
    select time, terminal_id 
    from Final_Sales 
    group by time, terminal_id 
    having count(*) = 1 
) begin 
    --query 
end else begin 
    --query 
end