2011-11-15 2 views
2

私はprocを書いています。 procは、データベース内の特定のアクティビティの発生をカウントします。データベース内にあるが、使用されていない任意の活動は、データベースから削除されていますテーブル変数から削除するか、新しい変数を作成しますか?

-- make table variable of occurrences 
DECLARE @occs TABLE(ActID int, Occurances int) 
INSERT INTO @occs(ActID,Occurances) 
    (SELECT Activities.ActivityID, COUNT(Users.ActivityID) AS Occurances 
    FROM Users JOIN Activities ON Users.ActivityID = Activities.ActivityID 
    GROUP BY Activities.ActivityID) 

-- Delete any activities that no one uses 
DELETE FROM Activities WHERE ActivityId NOT IN (SELECT ActID FROM @occs) 

(私のサイトに表示された)最終的な結果は、ビットStackOverflowのタグのsytemのように見える - それは、それぞれの名前が表示されます活動、その活動を行っている人の数。

すべてのユーザーを各アクティビティの人数に含める必要はありません。ただし、そのユーザーがそのアクティビティを実行している唯一のユーザーであれば、そのアクティビティを削除しないでください。

INSERT INTO @occs(ActID,Occurances) 
(SELECT Activities.ActivityID, COUNT(Users.ActivityID) AS Occurances 
    FROM Users 
JOIN Activities ON Users.ActivityID = Activities.ActivityID 
    WHERE (Users.CountsTowardsActivityTotal = 1) 
GROUP BY Activities.ActivityID) 

は、それが出力され@occsテーブルのこのバージョンです:以前のクエリを実行した後、だから、私は、再びoccurancesテーブルを移入する必要がありますので

-- return relevant results. 
SELECT a2.ActivityID, a2.ActivityName, occs.Occurances 
FROM 
    @occs occs JOIN Activities a2 on occs.ActID = a2.ActivityID 
ORDER BY 
    a2.Activity 

、私はすべて削除する必要があります@occsテーブルからの行が最初に塗りつぶされた後、新しいデータに配置されます。代わりに、私は新しいテーブル変数(occs2)を作成し、その代わりに使用することができます。

正しいことは何ですか。違いはありますか?

答えて

2

なぜ非常に多くのテーブル変数と集計および手続きステップが必要ですか?

あなたの最初のペアは次のとおりです。(?なぜGROUP BY)

  1. は、一部のユーザーが私のすべての使用の活動を付け
  2. あなたが前にこれについて考える場合どここのリストにない

を削除します。平易な言語でコーディングすると、「関連付けられているユーザーがいない場合は削除してください」:

DELETE FROM Activities WHERE NOT EXISTS 
    (SELECT * FROM Users U WHERE U.ActivityID = Activities.ActivityId) 

1つのクエリで1つを実行できます。 GROUP BYにActivities.ActivityNameを追加するだけです:

SELECT 
     Activities.ActivityID, Activities.ActivityName, COUNT(Users.ActivityID) AS Occurances 
FROM 
     Users 
     JOIN Activities ON Users.ActivityID = Activities.ActivityID 
WHERE 
     (Users.CountsTowardsActivityTotal = 1) 
GROUP BY 
     Activities.ActivityID, Activities.ActivityName 
ORDER 
     Activities.ActivityName 
+0

ありがとうございます。気づいたことがあるかもしれませんが、私はSQLにあまり慣れていません。 – Oliver

2

私の経験では、DELETEは常にコストがかかるので、おそらく新しいものを作成するだけです。しかし、私は、最初のパスのためにテーブル変数に値を設定する必要は全く見当たりません。

--removes activities not used 
DELETE FROM Activities 
FROM Activities LEFT JOIN Users ON Activities.ActivityID = Users.ActivityID 
WHERE Users.ActivityID IS NULL 

--do final select 
関連する問題