Есть ли альтернатива запросу с оператором SQL DELETE снежинка с CTE? - PullRequest
0 голосов
/ 24 сентября 2019

На снежинке, есть ли альтернатива запросу с оператором DELETE SQL с CTE?кажется, что это невозможно.

with t as (
select *  from "SNOWFLAKE_SAMPLE_DATA"."TPCDS_SF100TCL"."CALL_CENTER"
), p as (select t.CC_REC_END_DATE, t.CC_CALL_CENTER_ID , t.CC_REC_START_DATE from t where 1=1 AND t.CC_REC_START_DATE > '2000-01-01')

delete from p

Например: если мы используем выбор, мы получаем некоторые результаты.CTE with simple SQL select

но если я использую удаление.Он показывает синтаксическую ошибку

CTE with delete

Ответы [ 2 ]

0 голосов
/ 27 сентября 2019

Проблема этого подхода заключается в том, что SELECT возвращает некоторые значения, которые могут совпадать или не совпадать с отдельными записями в вашей таблице.В принципе, они могут возвращать четные комбинации значений из нескольких таблиц, нескольких строк или вообще без строк.Что бы вы хотели, чтобы DELETE делал тогда?

Итак, для DELETE вам необходимо указать, какие строки в таблице , с которой вы работаете, будут удалены.Вы можете сделать это с помощью простого предложения WHERE или предложения USING.

Если вы хотите, чтобы CTE были с DELETE, самым близким было бы использовать USING, поместить туда подзапрос и объединить его результат с таблицей.Во многих случаях это очень полезный подход, но он вызывает объединение, что влияет на производительность.Пример:

delete from CALL_CENTER t
using (
  select cc_call_center_sk from CALL_CENTER
  where 1=1 AND t.CC_REC_START_DATE > '2000-01-01'
) AS sub
where sub.cc_call_center_sk = t.cc_call_center_sk.

Но, опять же, для вашего запроса это не имеет особого смысла, и то, что написал @cddt, вероятно, является лучшим выбором.

0 голосов
/ 25 сентября 2019

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

Похоже, вы хотите удалить записи из таблицы SNOWFLAKE_SAMPLE_DATA.TPCDS_SF100TCL.CALL_CENTER, где поле CC_REC_START_DATE больше, чем 2000-01-01.Если это то, чего вы хотите достичь, тогда вам вообще не нужен CTE.

DELETE FROM SNOWFLAKE_SAMPLE_DATA.TPCDS_SF100TCL.CALL_CENTER t
WHERE t.CC_REC_START_DATE > '2000-01-01'
...