Удалить из таблицы переменную или сделать новую? - PullRequest
2 голосов
/ 15 ноября 2011

Я пишу процесс.Процесс подсчитывает случаи определенных действий в моей базе данных.Любые действия, которые есть в базе данных, но не используются, удаляются из базы данных:

-- 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 - он отображает имякаждого вида деятельности, и количество людей, которые делают это действие.

Не все пользователи должны быть включены в число людей в каждом действии.Однако, если они являются единственным пользователем, выполняющим это действие, его не следует удалять.Итак, мне нужно снова заполнить таблицу вхождений, после выполнения предыдущего запроса:

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:

-- 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 ]

2 голосов
/ 15 ноября 2011

Почему так много табличных переменных, агрегатов и процедурных шагов?

Ваша первая пара:

  1. Дайте мне все используемые действия какого-либо пользователя (почему GROUP BY?)
  2. Удалить где нет в этом списке

Если вы подумали об этом, прежде чем писать на простом языке, вы должны «удалить, если ни один пользователь не связан»:

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

Ваш второй может быть выполнен в одном запросе. Просто добавьте Activity.ActivityName в GROUP BY:

 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
2 голосов
/ 15 ноября 2011

По моему опыту, 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...