2013-02-19 1 views
0

Я новичок в SQL, так как я могу нормально уйти с простыми запросами/миграциями, не врываясь в него, однако у меня более сложный, который не включает соединение и мне интересно, как я удаляю, когда есть внешнее ограничение без использования на каскаде. Вот мой запрос. Я не мог найти хороший ответ от googling.УДАЛИТЬ строки с внешними ограничениями без использования «on cascade»

WITH aDeleteVariable AS (SELECT TOP 1 FooID as id FROM [BSystem].[Foo].[bar] order by  
CreateTimeUTC desc) 
DELETE FROM [BSystem].[Foo].[fooBar] where FooID = id 
DELETE FROM [BSystem].[Foo].[bar] where FooID = id 

Так что мне нужно удалить [BSystem]. [Foo] .fooBar первый, а затем [BSystem]. [Foo]. [Бар] Это будет выполняться во время выполнения, поэтому он не может быть жестко закодированы. «1» действительно будет n, однако у меня этот код разработан.

При попытке выполнить этот запрос я получил недопустимое имя столбца 'id'. Как я могу это исправить?

ответ

1

Ваши заявления DELETE не ссылаются aDeleteVariable. Столбец id существует только в контексте aDeleteVariable.

Вам необходимо присоединиться к aDeleteVariable в ваших заявлениях DELETE. Кроме того, вы не можете повторно использовать общее табличное выражение, поэтому вам нужно его дублировать.

См. Это SQL Fiddle (with simplified schema/table names), но ниже - это то, что вы хотите.

WITH aDeleteVariable AS (SELECT TOP 1 FooID as id 
     FROM [BSystem].[Foo].[bar] order by CreateTimeUTC desc) 
DELETE FB 
     FROM [BSystem].[Foo].[fooBar] AS FB 
     INNER JOIN aDeleteVariable AS DV ON (FB.FooID = DV.id); 
WITH aDeleteVariable AS (SELECT TOP 1 FooID as id 
     FROM [BSystem].[Foo].[bar] order by CreateTimeUTC desc) 
DELETE B 
     FROM [BSystem].[Foo].[bar] AS B 
     INNER JOIN aDeleteVariable AS DV ON (B.FooID = DV.id); 

Конечно, с присоединением к aDeleteVariable, вам не нужен id псевдоним. Следующее будет работать.

WITH aDeleteVariable AS (SELECT TOP 1 FooID 
     FROM [BSystem].[Foo].[bar] order by CreateTimeUTC desc) 
DELETE FB 
     FROM [BSystem].[Foo].[fooBar] AS FB 
     INNER JOIN aDeleteVariable AS DV ON (FB.FooID = DV.FooID); 
WITH aDeleteVariable AS (SELECT TOP 1 FooID 
     FROM [BSystem].[Foo].[bar] order by CreateTimeUTC desc) 
DELETE B 
     FROM [BSystem].[Foo].[bar] AS B 
     INNER JOIN aDeleteVariable AS DV ON (B.FooID = DV.FooID); 

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

DECLARE @DeleteVariable TABLE (FooID INT); 
INSERT INTO @DeleteVariable (FooID) 
     SELECT TOP 1 FooID FROM [BSystem].[Foo].[bar] 
       ORDER BY CreateTimeUTC DESC; 
DELETE FB 
     FROM [BSystem].[Foo].[fooBar] AS FB 
     INNER JOIN @DeleteVariable AS DV ON (FB.FooID = DV.FooID); 
DELETE B 
     FROM [BSystem].[Foo].[bar] AS B 
     INNER JOIN @DeleteVariable AS DV ON (B.FooID = DV.FooID); 
+0

Спасибо за ввод, однако, если я заменил id на aDeleteVariable, я получаю то же сообщение об ошибке с другим именем переменной. – LLL

+0

Спасибо! ^^ Я ценю помощь. – LLL

 Смежные вопросы

  • Нет связанных вопросов^_^