структура запроса sql - PullRequest
       20

структура запроса sql

0 голосов
/ 14 октября 2010

У меня есть задача очистки некоторых наших данных в SQL Server 2008 для CS2009.В нашей базе данных профилей есть две таблицы:

  1. Адреса
  2. UserObject

    Адрес:

    address_id, line1, line2 guid, varchar, varchar

    UserObject:

    userid_id, addressguids, acitivtydate guid, varchar, datetime

Мне нужно удалить все UserObjects, которые старше, чем X (т.е. не имели активности).Это, очевидно, не проблема.Моя проблема возникает, когда я хочу удалить адреса, которые принадлежат этому человеку.Они хранятся в одном поле в определенном порядке.Например, если у пользователя есть 2 адреса, он может выглядеть примерно так:

2;{guid1};{guid2}

Первое число - это число направляющих, разделенных точкой с запятой.В таблице адресов нет поля для user_id, чтобы можно было связать его (очень раздражает).Единственный идентификатор в таблице адресов - это адресный указатель.

Мой вопрос заключается в том, как я могу разобраться в этом в SQL (мой sql немного плох).Я хотел бы представить, что это будет что-то вроде:

  • выбрать всех пользователей, где ActivityDate> X
  • разделить строку guid адреса на части и получить каждую guid
  • удалить каждую guid втаблица адресов
  • удалить пользователя

Я думаю, что удалить адреса можно подстрокой или чем-то таким, чтобы удалить начальный номер и точку с запятой, затем заменить остальные точки с запятой на запятые и поместить их вкогда IN.

Я не имею ни малейшего понятия о цикле, лучших способах сделать это и тому подобное.

Спасибо

Ответы [ 2 ]

2 голосов
/ 14 октября 2010

Я думаю, делаю это поэтапно:

сначала создайте себе новую таблицу для user_address.это должно иметь user_id, а address_guid затем написать proc или цикл, чтобы разбить адресные указатели на эту новую структуру.Протрите его и начните сначала, если вы этого не сделали.

когда закончите, используйте это для удаления.должно быть намного проще.

0 голосов
/ 14 октября 2010

Если вы не хотите делать это с использованием новой таблицы, как было сказано ранее (кстати, в этом ответе нет ничего плохого), вы можете написать табличную функцию, которая выполняет некоторые операции со строками и возвращает всенаправляющие в поле 'addressguids' в новой строке с идентификатором пользователя.

После этого вы можете использовать CROSS APPLY или OUTER APPLY, чтобы присоединиться к функции, как если бы она была таблицей как описано в этой статье .

...