2016-02-17 6 views
1

Мне нужно выбрать записи, проверить мои критерии выбора и улучшить его, пока не получу все нужные мне записи, а затем удалите (или иным образом измените) их. Пойдем с удалением на данный момент.SQL select in delete DIRECTLY

select <fields> from <database> where <condition> 

(проверить, отрегулировать состояние)

delete from <database> where (<same condition>) 

Не здесь более простой способ, как трубы, например, засунуть выбранные записи непосредственно в ВЕЬЕТЕ? Я использовал методы выбора всех номеров записей во временную базу данных, но нет ли прямого пути?

Я искал Stack Overflow и нашел несколько вопросов, где люди спрашивают, как преобразовать оператор select в оператор delete, это не то, что я хочу. То, что я имею в виду что-то вроде:

select ... from ... where ... | delete 

или, может быть, что-то вроде этого, как обходной путь ...

/* create a list of records to delete */ 
select ... from ... where ... into @temp 

/* shove the list into delete */ 
delete @temp 

Имеет ли стандартные механизмы поддержки SQL для того, что я хочу, или там, может быть, подход к платформе (MS SQL Server)?

+4

Но зачем выбирать данные, которые вы не хотите хранить? Вы не можете просто удалить его? – jarlh

+0

Если вы хотите выбрать что-то на основе какого-то условия - сделайте выбор. Если вы хотите удалить с помощью какого-либо условия - удалите. Зачем смешивать его и изобретать новый синтаксис, трубы и так далее? –

+0

@jarlh По сути, он использует SQL в интерактивном режиме, поэтому для его (узкого) варианта использования и с его особым мышлением это имеет смысл. Я предполагаю, что он исходит из сценариев (Bash, PowerShell, что-то в этом роде). OP - пожалуйста, исправьте меня, если я неправильно понял :) –

ответ

5

Вы можете использовать Common Table Expression, например:

;WITH CTE AS (
    select <fields> 
    from <table> 
    where <condition> 
) 
DELETE FROM CTE 

Это заявление будет удалить все записи возвращаемых запросом.

При желании вы можете добавить дополнительные условия, применяемые к столу в линии, возвращаемого запрос КТРА, как:

;WITH CTE AS (
    select <fields> 
    from <table> 
    where <condition> 
) 
DELETE FROM CTE 
WHERE <more conditions on CTE fields> 
+0

Это хорошо работает и очень близко к тому, что я искал, спасибо очень. Tricky: выражение не будет работать без ведущих «;» ... – Nimral

+0

... Tricky: выражение не будет работать без ведущего ";" ... если я опустил это, я получаю сообщение типа «Синтаксическая ошибка рядом с ключевым словом WITH». Почему это? Я искал синтаксис WITH и CTE на веб-сайте Microsoft T-SQL ... они не упоминают ведущих «;». Но факт, утверждение не будет работать без него. Почему это? – Nimral

+1

@Nimral Вы только что столкнулись с единственным утверждением в tsql, которому требуется ';'! У вас ** есть **, чтобы разместить его прямо перед 'WITH', если есть другие заявления перед CTE. –

1

Учитывая тот факт, что, кажется, вы выполняете какое-то ручного манипулирование ваших данных, я предложит обернуть все, что вы делаете в транзакции. Это позволит вам увидеть результаты вашего заявления, прежде чем сделать его постоянным.

SELECT * FROM [table]; 

BEGIN TRAN 

DELETE FROM [table] WHERE [predicate]; 
SELECT * FROM [table]; 

ROLLBACK TRAN 
--COMMIT TRAN 
+0

Умная идея, используя транзакции, не приходила мне в голову. Огромное спасибо! – Nimral