Удалить две таблицы из таблицы переменных в SQL - PullRequest
1 голос
/ 23 февраля 2011

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

Пока у меня есть это

declare @deleted TABLE (Card int)

insert into @deleted
select Card from table1
where recordstatus = 4

delete from table2
from @deleted d
where table2.actionstring like d.card
and Select convert(varchar(8),today,112)
from(Select dateadd(year,-1,getdate())as today)aa

извините, если это сбивает с толку, я используюsql managment 2005 Я в основном хочу иметь возможность получить номер карты из таблицы один, проверьте, не превышает ли дата в таблице 2 год, если это так, удалите запись в таблице 1.

В таблице дваУ меня нет поля для номера карты, поэтому мне нужен оператор LIKE.

У меня только ошибка во второй части, которая гласит: - из @deleted d

Заранее спасибо

Ответы [ 4 ]

1 голос
/ 23 февраля 2011

Ваша вторая часть утверждения действительно довольно запутанная ... вы смешиваете DELETE с SELECT в предложении WHERE ..... чего именно вы именно здесь пытаетесь достичь ??

declare @deleted TABLE (Card int)

insert into @deleted
  select Card from table1
  where recordstatus = 4

delete table2
from @deleted d
where table2.actionstring LIKE '%' + CAST(d.card AS VARCHAR(20)) + '%'
and CONVERT(DATETIME, table2.Date, 112) <= DATEADD(YEAR, -1, GETDATE())

delete table1
from @deleted d
where table1.card = d.card
and CONVERT(DATETIME, table1.Date, 112) <= DATEADD(YEAR, -1, GETDATE())

Итак, вы пытаетесь удалить все строки из table2, где Table2.ActionString равен столбцу Card в вашей таблице @deleted ??Не совсем понятно.

Также: что с ограничением по дате?Какое поле в table2 вы хотите проверить?В каком состоянии - <= или >= или как?

1 голос
/ 23 февраля 2011
DELETE table1
FROM table1 INNER JOIN 
     table2 ON table1.card = table2.actionstring
WHERE table1.recordstatus = 4 AND
      table2.SomeDateColumn >= DATEADD(year, -1, GETDATE())
0 голосов
/ 23 февраля 2011

Тот факт, что table2 не имеет ключа, немного усложняет ситуацию.В частности, я не вижу, как избежать повторения поиска в table2 в этом случае.

В любом случае, здесь идет речь:

DECLARE @deleted TABLE (card int);

/* store cards that are actually going to be deleted */
INSERT INTO @deleted (card)
SELECT DISTINCT t1.card
FROM table1 t1
  INNER JOIN table2 t2 ON t2.Date <= DATEADD(year, -1, GETDATE())
    AND t2.actionstring LIKE '%' + RIGHT(100000000 + t1.card, 8) + '%'
WHERE t1.recordstatus = 4

/* delete the history for the selected cards */
DELETE FROM t2
FROM @deleted t1
  INNER JOIN table2 t2 ON t2.Date <= DATEADD(year, -1, GETDATE())
    AND t2.actionstring LIKE '%' + RIGHT(100000000 + t1.card, 8) + '%'

/* delete the cards from table1 */
DELETE FROM table1
FROM @deleted d
WHERE table1.card = d.card
  AND table1.recordstatus = 4  /* not sure if this condition is needed again
                                  but it will certainly do no harm */
0 голосов
/ 23 февраля 2011

Попробуйте что-то вроде:

delete t1
from
   table1 t1
   join table2 t2
      on t2.actionstring like t1.card + '%'
      and [... other criteria ...]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...