SnowConvert AI - Servidor SQL - Azure Synapse - DMLs¶
BETWEEN¶
Retorna TRUE quando a expressão de entrada (numérica ou cadeia de caracteres) estiver dentro dos limites inferior e superior especificados.
Applies to
SQL Server
Azure Synapse Analytics
Nota
Algumas partes do código de saída foram omitidas por motivos de clareza.
Código-fonte
Código esperado
BULK INSERT¶
Referência de tradução para a instrução Bulk Insert.
Applies to
SQL Server
Azure Synapse Analytics
Algumas partes do código de saída foram omitidas por motivos de clareza.
A conversão direta para BULK INSERT é a instrução do Snowflake COPY INTO. COPY INTO não usa diretamente o caminho do arquivo para recuperar os valores. O arquivo deve existir antes em um STAGE. Além disso, as opções usadas em BULK INSERT devem ser especificadas em um Snowflake FILE FORMAT que será consumido pelo STAGE ou diretamente pelo COPY INTO.
Para adicionar um arquivo a algum STAGE, você deve usar o comando PUT . Observe que o comando só pode ser executado a partir do SnowSQL CLI. Aqui está um exemplo das etapas que devemos seguir antes de executar um COPY INTO:
SQL Server¶
Snowflake¶
As you see in the code above, SnowConvert AI identifies all the BULK INSERTS in the code, and for each instance, a new STAGE and FILE FORMAT will be created before the copy into execution. In addition, after the creation of the STAGE, a PUT command will be created as well to add the file to the stage.
The names of the generated statements are auto-generated using the current timestamp in seconds, to avoid collisions between their usages.
Por fim, todas as opções para a inserção em massa estão sendo mapeadas para opções de formato de arquivo, se aplicável. Se a opção não for compatível com o Snowflake, ela será comentada e um aviso será adicionado. Consulte também SSC-FDM-TS0004.
Opções de massa suportadas¶
SQL Server |
Snowflake |
|---|---|
FORMAT |
TYPE |
FIELDTERMINATOR |
FIELD_DELIMITER |
FIRSTROW |
SKIP_HEADER |
ROWTERMINATOR |
RECORD_DELIMITER |
FIELDQUOTE |
FIELD_OPTIONALLY_ENCLOSED_BY |
Expressão de tabela comum (CTE)¶
Applies to
SQL Server
Azure Synapse Analytics
Algumas partes do código de saída foram omitidas por motivos de clareza.
As expressões de tabela comuns são compatíveis com o Snowflake SQL por padrão.
Sintaxe¶
Snowflake SQL¶
Subconsulta:
CTE recursivo:
Onde:
Detalhes dignos de nota¶
The RECURSIVE keyword does not exist in T-SQL, and the transformation does not actively add the keyword to the result. A warning is added to the output code to state this behavior.
Expressão de tabela comum com SELECT INTO¶
A transformação a seguir ocorre quando a expressão WITH é seguida por uma instrução SELECT INTO e será transformada em uma expressão TEMPORARY TABLE.
SQL Server:¶
Snowflake:¶
Expressão de tabela comum com outras expressões¶
A transformação a seguir ocorre quando a expressão WITH é seguida por instruções INSERT ou DELETE.
SQL Server:¶
Snowflake:¶
Expressão de tabela comum com Delete From¶
Para essa transformação, ela só se aplicará a uma CTE (Expressão de tabela comum) com um Delete From, no entanto, somente para algumas especificidades CTE. Ele deve ter apenas um CTE, e deve ter dentro dele uma função de ROW_NUMBER ou RANK.
O objetivo do CTE com Delete deve ser remover duplicatas de uma tabela. Caso o CTE com Delete pretenda remover outro tipo de dados, essa transformação não se aplicará.
Vejamos um exemplo. Para um exemplo prático, precisamos primeiro criar uma tabela com alguns dados.
Observe que há um valor duplicado. As linhas 8 e 12 inserem o mesmo valor. Agora vamos eliminar as linhas duplicadas em uma tabela.
Se executarmos um Select da tabela, ele mostrará o seguinte resultado
ID |
Valor |
StringValue |
|---|---|---|
100 |
100 |
Primeiro |
200 |
200 |
Segundo |
300 |
300 |
Terceiro |
400 |
400 |
Quarto |
Note that the duplicated rows have been removed. To preserve this functionality in Snowflake, which does not support DELETE from a CTE, SnowConvert transforms the statement into the following:
Como você pode ver, a consulta é transformada em uma tabela Create Or Replace.
To test it in Snowflake, you will need the table.
Agora, se executarmos o resultado da transformação e, em seguida, um Select para verificar se as linhas duplicadas foram excluídas, este será o resultado.
ID |
Valor |
StringValue |
|---|---|---|
100 |
100 |
Primeiro |
200 |
200 |
Segundo |
300 |
300 |
Terceiro |
400 |
400 |
Quarto |
Expressão de tabela comum com a instrução MERGE¶
A seguinte transformação ocorre quando a expressão WITH é seguida pela instrução MERGE e será transformada em uma expressão MERGE INTO.
SQL Server:¶
Snowflake:¶
Expressão de tabela comum com a instrução UPDATE¶
A transformação a seguir ocorre quando a expressão WITH é seguida por uma instrução UPDATE e será transformada em uma instrução UPDATE.
SQL Server:¶
Snowflake:¶
Problemas conhecidos¶
Não foram encontrados problemas.
EWIs relacionados¶
SSC-EWI-0108: A subconsulta a seguir corresponde a pelo menos um dos padrões considerados inválidos e pode produzir erros de compilação.
SSC-PRF-TS0001: Aviso de desempenho - recursão para CTE não verificado. Pode exigir uma palavra-chave recursiva.
DELETE¶
Referência de tradução para instrução Transact-SQL Delete para o Snowflake
Applies to
SQL Server
Azure Synapse Analytics
Nota
Algumas partes do código de saída foram omitidas por motivos de clareza.
Descrição¶
Removes one or more rows from a table or view in SQL Server. For more information, see the SQL Server DELETE documentation.
Amostra de padrões da origem¶
Amostra de dados¶
SQL Server¶
Snowflake¶
Case básico¶
A transformação para a instrução DELETE é bastante simples, com algumas ressalvas. Uma dessas ressalvas é a forma como o Snowflake oferece suporte a várias fontes na cláusula FROM. No entanto, há um equivalente no Snowflake, conforme mostrado abaixo.
SQL Server¶
Snowflake¶
Nota
Observe que, como o DELETE original era para T1, a presença de TABLE2 T2 na cláusula FROM exige a criação da cláusula USING.
Excluir duplicatas de uma tabela¶
A documentação a seguir explica um padrão comum usado para remover linhas duplicadas de uma tabela no SQL Server. Essa abordagem usa a função ROW_NUMBER para particionar os dados com base no key_value, que pode ser uma ou mais colunas separadas por vírgulas. Em seguida, exclua todos os registros que receberam um valor de número de linha maior que 1. Esse valor indica que os registros são duplicados. Você pode ler a documentação referenciada para entender o comportamento desse método e recriá-lo.
O exemplo a seguir usa essa abordagem para remover duplicatas de uma tabela e seu equivalente no Snowflake. A transformação consiste em executar uma instrução INSERT OVERWRITE que trunca a tabela (remove todos os dados) e, em seguida, insere novamente as linhas na mesma tabela, ignorando as duplicadas. O código de saída é gerado considerando as mesmas cláusulas PARTITION BY e ORDER BY usadas no código original.
SQL Server¶
Criar uma tabela com linhas duplicadas
Inserção de duplicatas¶
Saída¶
someID |
col2 |
col3 |
col4 |
col5 |
|---|---|---|---|---|
10 |
true |
falso |
falso |
true |
10 |
true |
falso |
falso |
true |
11 |
true |
true |
falso |
true |
12 |
falso |
falso |
true |
true |
12 |
falso |
falso |
true |
true |
13 |
true |
falso |
true |
falso |
14 |
true |
falso |
true |
falso |
14 |
true |
falso |
true |
falso |
Remoção de duplicatas¶
Saída¶
someID |
col2 |
col3 |
col4 |
col5 |
|---|---|---|---|---|
10 |
true |
falso |
falso |
true |
11 |
true |
true |
falso |
true |
12 |
falso |
falso |
true |
true |
13 |
true |
falso |
true |
falso |
14 |
true |
falso |
true |
falso |
Snowflake¶
Criar uma tabela com linhas duplicadas
Inserção de duplicatas¶
Saída¶
someID |
col2 |
col3 |
col4 |
col5 |
|---|---|---|---|---|
10 |
true |
falso |
falso |
true |
10 |
true |
falso |
falso |
true |
11 |
true |
true |
falso |
true |
12 |
falso |
falso |
true |
true |
12 |
falso |
falso |
true |
true |
13 |
true |
falso |
true |
falso |
14 |
true |
falso |
true |
falso |
14 |
true |
falso |
true |
falso |
Remoção de duplicatas¶
Saída¶
someID |
col2 |
col3 |
col4 |
col5 |
|---|---|---|---|---|
10 |
true |
falso |
falso |
true |
11 |
true |
true |
falso |
true |
12 |
falso |
falso |
true |
true |
13 |
true |
falso |
true |
falso |
14 |
true |
falso |
true |
falso |
Aviso
Considere que pode haver diversas variações desse padrão, mas todas elas se baseiam no mesmo princípio e têm a mesma estrutura.
DELETE WITH INNER JOIN¶
SQL SERVER¶
Saída¶
EmployeeID |
FirstName |
LastName |
DepartmentID |
|---|---|---|---|
5 |
Michael |
Davis |
nulo |
6 |
Lucas |
Parker |
8 |
Snowflake¶
Saída¶
EmployeeID |
FirstName |
LastName |
DepartmentID |
|---|---|---|---|
5 |
Michael |
Davis |
nulo |
6 |
Lucas |
Parker |
8 |
DELETE WITH LEFT JOIN¶
SQL Server¶
Saída¶
EmployeeID |
FirstName |
LastName |
DepartmentID |
|---|---|---|---|
1 |
John |
Doe |
1 |
2 |
Jane |
Smith |
2 |
3 |
Bob |
Johnson |
1 |
4 |
Alice |
Brown |
3 |
Snowflake¶
Saída¶
EmployeeID |
FirstName |
LastName |
DepartmentID |
|---|---|---|---|
1 |
John |
Doe |
1 |
2 |
Jane |
Smith |
2 |
3 |
Bob |
Johnson |
1 |
4 |
Alice |
Brown |
3 |
DELETE WITH RIGHT JOIN¶
SQL SERVER¶
Saída¶
EmployeeID |
FirstName |
LastName |
DepartmentID |
|---|---|---|---|
5 |
Michael |
Davis |
nulo |
6 |
Lucas |
Parker |
8 |
Snowflake¶
Saída¶
EmployeeID |
FirstName |
LastName |
DepartmentID |
|---|---|---|---|
5 |
Michael |
Davis |
nulo |
6 |
Lucas |
Parker |
8 |
Problemas conhecidos¶
FULL JOIN sem suporte\ O FULL JOIN não pode ser representado usando a sintaxe (+). Quando encontrado, SnowConvert AI vai avisá-lo sobre isso com um FDM.
SQL Server¶
Snowflake¶
EWIs relacionados¶
SSC-EWI-TS0081: O uso de uma junção completa em uma instrução de exclusão não é suportado
DROP STATEMENT¶
Instruções DROP
Applies to
SQL Server
Azure Synapse Analytics
Algumas partes do código de saída foram omitidas por motivos de clareza.
DROP TABLE¶
Transact-SQL¶
Snowflake¶
Conversão¶
A conversão para instruções DROP TABLE únicas é muito simples. Desde que haja apenas uma tabela sendo descartada na instrução, ela será deixada como está.
Por exemplo:
A única diferença digna de nota entre o SQL Server e o Snowflake aparece quando a instrução de entrada descarta mais de uma tabela. Nesses cenários, uma instrução DROP TABLE diferente é criada para cada tabela que está sendo descartada.
Por exemplo:
SQL Server¶
Snowflake¶
EXISTS¶
Subconsultas Transact-SQL usando detalhes da transformação da instrução EXISTS
Applies to
SQL Server
Azure Synapse Analytics
Algumas partes do código de saída foram omitidas por motivos de clareza.
Tipos de subconsultas¶
As subconsultas podem ser categorizadas como correlacionadas ou não correlacionadas:
Uma subconsulta correlacionada refere-se a uma ou mais colunas de fora da subconsulta. (As colunas são normalmente referenciadas dentro da cláusula WHERE da subconsulta). Uma subconsulta correlacionada pode ser pensada como um filtro na tabela a que se refere, como se a subconsulta fosse avaliada em cada linha da tabela na consulta externa.
Uma subconsulta não correlacionada não tem tais referências de colunas externas. É uma consulta independente, cujos resultados são retornados e utilizados pela consulta externa uma vez (não por linha).
A instrução EXISTS é considerada uma subconsulta correlacionada.
SQL SERVER¶
Snowflake¶
IN¶
Subconsultas Transact-SQL usando detalhes da transformação da instrução IN
Applies to
SQL Server
Azure Synapse Analytics
Algumas partes do código de saída foram omitidas por motivos de clareza.
O operador IN verifica se uma expressão está incluída nos valores retornados por uma subconsulta.
SQL SERVER¶
Snowflake¶
INSERT¶
Referência de tradução para instrução de inserção do SQL Server para o Snowflake
Applies to
SQL Server
Azure Synapse Analytics
Algumas partes do código de saída foram omitidas por motivos de clareza.
Descrição¶
Adds one or more rows to a table or a view in SQL Server. For more information, see the SQL Server INSERT documentation.
Comparação de sintaxe¶
A gramática básica de inserção é equivalente em ambas as linguagens SQL. No entanto, ainda existem alguns outros elementos de sintaxe no SQL Server que mostram diferenças, por exemplo, um deles permite que o desenvolvedor adicione um valor a uma coluna usando o operador assign. A sintaxe mencionada também será transformada na sintaxe básica de inserção.
Snowflake¶
SQL Server¶
Amostra de padrões da origem¶
INSERT Básico¶
SQL Server¶
Snowflake¶
INSERT with assign operator¶
SQL Server¶
Snowflake¶
INSERT sem INTO¶
SQL Server¶
Snowflake¶
INSERT com expressão de tabela comum¶
SQL Server¶
Snowflake¶
INSERT com fator DML de tabela com MERGE como DML¶
Este caso é tão específico em que a instrução INSERT tem uma consulta SELECT, e a cláusula FROM do SELECT mencionado contém uma instrução MERGE DML. Procurando um equivalente no Snowflake, as seguintes instruções são criadas: uma tabela temporária, a instrução merge convertida e, finalmente, a instrução insert.#x20;
SQL Server¶
Snowflake¶
NOTE: como o nome do padrão sugere, é ONLY para casos em que o insert vem com um select… do qual o body contém uma instrução MERGE .#x20;
Problemas conhecidos¶
1. Elementos de sintaxe que exigem mapeamentos especiais:
[INTO]: Essa palavra-chave é obrigatória no Snowflake e deve ser adicionada se não estiver presente.
[DEFAULT VALUES]: Insere o valor padrão em todas as colunas especificadas na inserção. Deve ser transformado em VALUES (DEFAULT, DEFAULT, …), a quantidade de DEFAULTs adicionada é igual ao número de colunas que a inserção modificará. Por enquanto, há um aviso sendo adicionado.
SQL Server¶
Snowflake¶
2. Elementos de sintaxe não suportados ou irrelevantes:
[TOP (expressão) [PERCENT]]: Indica a quantidade ou o percentual de linhas que serão inseridas. Sem suporte.
[rowset_function\_limited]: É OPENQUERY() ou OPENROWSET(), usado para ler dados de servidores remotos. Sem suporte.
[WITH table_hint_limited]: São usados para obter bloqueios de leitura/gravação em tabelas. Não é relevante no Snowflake.
[<OUTPUT Clause>]: Especifica uma tabela ou um conjunto de resultados em que as linhas inseridas também serão inseridas. Sem suporte.
[execute_statement]: Pode ser usado para executar uma consulta para obter dados. Sem suporte.
[dml_table\_source]: Um conjunto de resultados temporários gerado pela cláusula OUTPUT de outra instrução DML. Sem suporte.
3. O caso DELETE não está sendo considerado.
Para INSERT com fator de tabela DML com MERGE como padrão DML, o caso DELETE não está sendo considerado na solução, portanto, se a instrução de mesclagem do código-fonte tiver um caso DELETE, considere que pode não funcionar como esperado.;
EWIs relacionados¶
SSC-EWI-0073: Revisão de equivalência funcional pendente.
SSC-FDM-TS0026: o caso DELETE não está sendo considerado.
MERGE¶
Detalhes da transformação da instrução Transact-SQL MERGE
Applies to
SQL Server
Azure Synapse Analytics
Comparação de sintaxe¶
Snowflake¶
Transact-SQL¶
Exemplo¶
Dado o código-fonte a seguir:
SQL Server¶
Você pode esperar obter algo parecido com isto:
Snowflake¶
EWIs relacionados¶
SSC-EWI-0021: A sintaxe não é compatível com o Snowflake.
SELECT¶
Referência de tradução para converter instrução select do SQL Server para Snowflake
Applies to
SQL Server
Azure Synapse Analytics
Algumas partes do código de saída foram omitidas por motivos de clareza.
Descrição¶
Allows the selection of one or more rows or columns of one or more tables in SQL Server. For more information, see the SQL Server SELECT documentation.
Amostra de padrões da origem¶
SELECT WITH COLUMN ALIASES¶
O exemplo a seguir demonstra como usar aliases de coluna no Snowflake. Espera-se que as duas primeiras colunas, do código do SQL Server, sejam transformadas de um formulário de atribuição em um formulário normalizado usando a palavra-chave AS. A terceira e a quarta colunas estão usando formatos válidos do Snowflake.
SQL Server¶
Snowflake¶
SELECT TOP¶
SQL Server¶
Snowflake¶
SELECT INTO¶
O exemplo a seguir mostra que SELECT INTO é transformado em um CREATE TABLE AS; isso é porque no Snowflake não há equivalente para SELECT INTO e, para criar uma tabela baseada em uma consulta, tem que ser com CREATE TABLE AS.
SQL Server¶
Snowflake¶
Outro caso é quando você inclui operadores de conjunto, como EXCEPT e INTERSECT. A transformação é basicamente a mesma que a anterior.
SQL Server¶
Snowflake¶
SELECT TOP Additional Arguments¶
Como as palavras-chave PERCENT e WITH TIES afetam o resultado e não são compatíveis com o Snowflake, elas serão comentadas e adicionadas como um erro.
SQL Server¶
Snowflake¶
SELECT FOR¶
The FOR XML clause is transformed differently depending on whether the path is empty or not.
FOR XML PATH(“”) — Empty path (string concatenation pattern):
FOR XML PATH('') is a common SQL Server pattern used for string concatenation (before STRING_AGG was introduced). When the path is empty and there is no ROOT clause, the query is transformed to use LISTAGG with CONCAT instead of XML functions, because the intent is string aggregation rather than XML generation.
SQL Server¶
Snowflake¶
When there is a single expression, CONCAT is omitted:
SQL Server¶
Snowflake¶
FOR XML PATH — Non-empty path (XML generation):
When the path is not empty, the FOR XML PATH clause is converted to use FOR_XML_UDF with OBJECT_CONSTRUCT to produce XML output. This conversion emits SSC-FDM-TS0016 because the resulting XML format in Snowflake may differ from SQL Server.
SQL Server¶
Snowflake¶
SELECT OPTION¶
A cláusula OPTION não é suportada pelo Snowflake. Ela será comentada e adicionada como um aviso durante a transformação.
Observe que a instrução OPTION foi removida da transformação porque não é relevante ou não é necessária no Snowflake.
SQL Server¶
Snowflake¶
SELECT WITH¶
A cláusula WITH não é suportada pelo Snowflake. Ela será comentada e adicionada como um aviso durante a transformação.
Observe que a instrução WITH(NOLOCK, NOWAIT) foi removida da transformação porque não é relevante ou não é necessária no Snowflake.
SQL Server¶
Snowflake¶
EWIs relacionados¶
SSC-EWI-0040: Instrução não suportada.
SSC-FDM-TS0016: Colunas XML no Snowflake podem ter um formato diferente
SET OPERATORS¶
Applies to
SQL Server
Azure Synapse Analytics
Os operadores de conjunto no TSQL e no Snowflake apresentam a mesma sintaxe e cenários compatíveis (EXCEPT, INTERSECT, UNION e UNION ALL), com exceção do MINUS que não é compatível com TSQL, resultando no mesmo código durante a conversão.
TRUNCATE¶
Detalhes da transformação da instrução Transact-SQL TRUNCATE
Applies to
SQL Server
Azure Synapse Analytics
Algumas partes do código de saída foram omitidas por motivos de clareza.
SQL Server¶
Snowflake¶
UPDATE¶
Referência de tradução para converter instrução update do SQL Server para Snowflake
Applies to
SQL Server
Azure Synapse Analytics
Nota
Algumas partes do código de saída foram omitidas por motivos de clareza.
Descrição¶
Changes existing data in a table or view in SQL Server. For more information, see the SQL Server UPDATE documentation.
Amostra de padrões da origem¶
UPDATE Básico¶
A conversão para uma instrução regular UPDATE é muito simples. Como a estrutura básica UPDATE é suportada por padrão no Snowflake, as exceções são as partes em que você verá algumas diferenças.
SQL Server¶
Snowflake¶
Produtos cartesianos¶
O SQL Server permite adicionar referências circulares entre a tabela de destino da instrução Update e a cláusula FROM/ Em tempo de execução, o otimizador de banco de dados remove qualquer produto cartesiano gerado. Caso contrário, o Snowflake atualmente não otimiza esse cenário, produzindo um produto cartesiano que pode ser verificado no Plano de Execução.\
Para resolver isso, se houver um JOIN em que uma de suas tabelas seja a mesma que o destino da atualização, essa referência será removida e adicionada à cláusula WHERE, e será usada apenas para filtrar os dados e evitar uma operação de conjunto.
SQL Server¶
Snowflake¶
Cláusula OUTPUT¶
A cláusula OUTPUT não é suportada pelo Snowflake.
SQL Server¶
Snowflake¶
CTE¶
A cláusula WITH CTE é movida para a consulta interna na instrução Update para ser suportada pelo Snowflake.
SQL Server¶
Snowflake¶
Cláusula TOP¶
A cláusula TOP não é suportada pelo Snowflake.
SQL Server¶
Snowflake¶
WITH TABLE HINT LIMITED¶
A cláusula Update WITH não é suportada pelo Snowflake.
SQL Server¶
Snowflake¶
EWIs relacionados¶
SSC-EWI-0021: A sintaxe não é compatível com o Snowflake.
UPDATE WITH JOIN¶
Especificação de tradução para instrução UPDATE com cláusulas WHERE e JOIN
Aviso
Este é um trabalho em andamento e pode mudar no futuro.
Descrição¶
O padrão UPDATE FROM é usado para atualizar dados com base em dados de outras tabelas. Esta documentação do SQLServer fornece um exemplo simples.
Analise a seguinte sintaxe do SQL Server da documentação.
Sintaxe do SQL Server¶
table_name: A tabela ou visualização que você está atualizando.SET: Especifica as colunas e seus novos valores. A cláusulaSETatribui um novo valor (ou expressão) a uma ou mais colunas.FROM: Usado para especificar uma ou mais tabelas de origem (como uma junção). Isso ajuda a definir de onde vêm os dados para realizar a atualização.WHERE: Especifica quais linhas devem ser atualizadas com base na(s) condição(ões). Sem essa cláusula, todas as linhas da tabela seriam atualizadas.OPTION (query_hint): Especifica dicas para otimização de consultas.
Sintaxe do Snowflake¶
A sintaxe do Snowflake também pode ser revisada na documentação do Snowflake.
Nota
O Snowflake não é compatível com JOINs na cláusula UPDATE.
Parâmetros obrigatórios
_
target_table:_especifica a tabela a ser atualizada._
col_name:especifica o nome de uma coluna em _target_table. Não inclua o nome da tabela. Por exemplo,UPDATE t1 SET t1.col = 1é inválido._
value:especifica o novo valor a ser definido em _col_name.
Parâmetros opcionais
FROM``_additional_tables:_ Especifica uma ou mais tabelas a serem usadas para selecionar linhas a serem atualizadas ou para definir novos valores. observe que a repetição da tabela de destino resulta em uma junção automáticaWHERE``_condition:_Ta expressão que especifica as linhas da tabela de destino a serem atualizadas. Padrão: sem valor (todas as linhas da tabela de destino são atualizadas)
Resumo da conversão¶
Tipo SQL Server JOIN |
Snowflake Best Alternative |
|---|---|
|
Use a tabela de destino na cláusula |
Vários |
Use a tabela de destino na cláusula |
Vários |
Usar subconsulta + operação IN |
|
Usar subconsulta + operação IN |
Vários |
Use o Snowflake |
Vários |
Use o Snowflake |
RIGHT JOIN único |
Use a tabela na cláusula |
_Nota 1: JOIN simples pode usar a tabela na cláusula FROM e adicionar filtros na cláusula WHERE, conforme necessário
Nota 2: Outras abordagens podem incluir o operando (+) para definir JOINs.
Amostra de padrões da origem¶
Dados de configuração¶
SQLServer¶
Snowflake¶
Data Insertion for samples
Caso 1: Atualização de INNER JOIN única¶
Para INNER JOIN, se a tabela for usada dentro das instruções FROM, ela se transformará automaticamente em INNER JOIN. Observe que há várias abordagens para dar suporte a JOINs em instruções UPDATE no Snowflake. Esse é um dos padrões mais simples para garantir a legibilidade.
SQL Server¶
Saída¶
CustomerID |
Quantidade |
CustomerName |
|---|---|---|
1 |
10 |
John Doe |
Snowflake¶
Saída¶
CustomerID |
Quantidade |
CustomerName |
|---|---|---|
1 |
10 |
John Doe |
Outras abordagens:
MERGE INTO
IN Operation
Caso 2: Atualização de múltiplos INNER JOIN¶
SQL Server¶
Saída¶
CustomerID |
Quantidade |
CustomerName |
|---|---|---|
3 |
5 |
Alice Johnson |
Snowflake¶
Saída¶
CustomerID |
Quantidade |
CustomerName |
|---|---|---|
3 |
5 |
Alice Johnson |
Caso 3: Atualização de múltiplos INNER JOIN com condição agregada¶
SQL Server¶
Saída¶
CustomerID |
CustomerName |
Quantidade |
Price |
|---|---|---|---|
11 |
Jack Grey |
6 |
29,99 |
18 |
Quincy Brown |
6 |
15,99 |
20 |
Sam Green |
6 |
89,99 |
22 |
Ursula Red |
6 |
9,99 |
24 |
Wendy Black |
6 |
49,99 |
Snowflake¶
Saída¶
CustomerID |
CustomerName |
Quantidade |
Price |
|---|---|---|---|
11 |
Jack Grey |
6 |
29,99 |
18 |
Quincy Brown |
6 |
15,99 |
20 |
Sam Green |
6 |
89,99 |
22 |
Ursula Red |
6 |
9,99 |
24 |
Wendy Black |
6 |
49,99 |
Caso 4: Atualização de LEFT JOIN única¶
SQL Server¶
Saída¶
OrderID |
CustomerID |
ProductID |
Quantidade |
OrderDate |
|---|---|---|---|---|
5 |
nulo |
5 |
7 |
2024-11-05 |
13 |
nulo |
13 |
13 |
2024-11-13 |
Snowflake¶
Saída¶
OrderID |
CustomerID |
ProductID |
Quantidade |
OrderDate |
|---|---|---|---|---|
5 |
nulo |
5 |
7 |
2024-11-05 |
13 |
nulo |
13 |
13 |
2024-11-13 |
Nota
Essa abordagem no Snowflake não funcionará porque não atualiza as linhas necessárias:
UPDATE Orders O SET O.Quantity = 13 FROM Customers C WHERE O.CustomerID = C.CustomerID AND C.CustomerID IS NULL AND O.ProductID = 13;
Caso 5: Múltiplos LEFT JOIN e RIGHT JOIN Update¶
Esse é um padrão mais complexo. Para converter vários LEFT JOINs, consulte o padrão a seguir:
Nota
LEFT JOIN e RIGHT JOIN dependerão da ordem na cláusula FROM.
SQL Server¶
Saída¶
OrderID |
CustomerID |
ProductID |
Quantidade |
OrderDate |
|---|---|---|---|---|
3 |
3 |
3 |
3 |
2024-11-12 |
Snowflake¶
Saída¶
OrderID |
CustomerID |
ProductID |
Quantidade |
OrderDate |
|---|---|---|---|---|
3 |
3 |
3 |
3 |
2024-11-12 |
Caso 6: Atualização de INNER JOIN e LEFT JOIN mistos¶
SQL Server¶
Saída¶
CustomerID |
CustomerName |
Quantidade |
|---|---|---|
nulo |
nulo |
4 |
Snowflake¶
Saída¶
CustomerID |
CustomerName |
Quantidade |
|---|---|---|
nulo |
nulo |
4 |
Caso 7: Atualização de RIGHT JOIN único¶
SQL Server¶
Saída¶
OrderID |
CustomerID |
ProductID |
Quantidade |
CustomerName |
|---|---|---|---|---|
3 |
3 |
3 |
1000 |
Alice Johnson |
Snowflake¶
Saída¶
OrderID |
CustomerID |
ProductID |
Quantidade |
CustomerName |
|---|---|---|---|---|
3 |
3 |
3 |
1000 |
Alice Johnson |
Problemas conhecidos¶
Como
UPDATEno Snowflake não permite o uso deJOINsdiretamente, pode haver casos que não correspondam aos padrões descritos.
UPDATE com LEFT e RIGHT JOIN¶
Especificação de tradução para a instrução UPDATE com JOINs.
Applies to
SQL Server
Azure Synapse Analytics
Aviso
Parcialmente suportado no Snowflake
Descrição¶
O padrão UPDATE FROM é usado para atualizar dados com base em dados de outras tabelas. Esta documentação do SQLServer fornece um exemplo simples.
Analise a seguinte sintaxe do SQL Server da documentação.
Sintaxe do SQL Server¶
table_name: A tabela ou visualização que você está atualizando.SET: Especifica as colunas e seus novos valores. A cláusulaSETatribui um novo valor (ou expressão) a uma ou mais colunas.FROM: Usado para especificar uma ou mais tabelas de origem (como uma junção). Isso ajuda a definir de onde vêm os dados para realizar a atualização.WHERE: Especifica quais linhas devem ser atualizadas com base na(s) condição(ões). Sem essa cláusula, todas as linhas da tabela seriam atualizadas.OPTION (query_hint): Especifica dicas para otimização de consultas.
Sintaxe do Snowflake¶
A sintaxe do Snowflake também pode ser revisada na documentação do Snowflake.
Nota
O Snowflake não é compatível com JOINs na cláusula UPDATE.
Parâmetros obrigatórios
_
target_table:_especifica a tabela a ser atualizada._
col_name:especifica o nome de uma coluna em _target_table. Não inclua o nome da tabela. Por exemplo,UPDATE t1 SET t1.col = 1é inválido._
value:especifica o novo valor a ser definido em _col_name.
Parâmetros opcionais
FROM``_additional_tables:_ Especifica uma ou mais tabelas a serem usadas para selecionar linhas a serem atualizadas ou para definir novos valores. observe que a repetição da tabela de destino resulta em uma junção automáticaWHERE``_condition:_Ta expressão que especifica as linhas da tabela de destino a serem atualizadas. Padrão: sem valor (todas as linhas da tabela de destino são atualizadas)
Resumo da conversão¶
Como é explicado na descrição da sintaxe, não há uma solução equivalente direta para JOINs dentro da cláusula UPDATE. Por esse motivo, a abordagem para transformar essas instruções é adicionar o operador (+) na coluna que logicamente adicionará os dados necessários na tabela. Este operador (+) é adicionado aos casos em que as tabelas são referenciadas na seção LEFT/RIGHT JOIN. Geralmente;
Notice that there are other languages that use this operator (+) and the position of the operator may determine the type of join. In this specific case in Snowflake, the position will not determine the join type but the association with the logically needed tables and columns will.
Even when there are other alternative as MERGE clause or the usages of a CTE; these alternatives tend to turn difficult to read when there are complex queries, and get extensive.
Amostra de padrões da origem¶
Dados de configuração¶
SQL Server¶
Snowflake¶
LEFT JOIN¶
SQL Server¶
Saída antes da consulta¶
Col1 |
Col2 |
Col3 |
Col4 |
Col5 |
Col6 |
|---|---|---|---|---|---|
1 |
A1 |
B1 |
C1 |
null |
null |
2 |
A2 |
B2 |
C2 |
null |
null |
3 |
A3 |
B3 |
C3 |
null |
null |
Saída após a consulta¶
Col1 |
Col2 |
Col3 |
Col4 |
Col5 |
Col6 |
|---|---|---|---|---|---|
1 |
A1 |
B1 |
C1 |
X1 |
Description1 |
2 |
A2 |
B2 |
C2 |
X2 |
Description2 |
3 |
A3 |
B3 |
C3 |
X3 |
Description3 |
Snowflake¶
Saída antes da consulta¶
Col1 |
Col2 |
Col3 |
Col4 |
Col5 |
Col6 |
|---|---|---|---|---|---|
1 |
A1 |
B1 |
C1 |
null |
null |
2 |
A2 |
B2 |
C2 |
null |
null |
3 |
A3 |
B3 |
C3 |
null |
null |
Saída após a consulta¶
Col1 |
Col2 |
Col3 |
Col4 |
Col5 |
Col6 |
|---|---|---|---|---|---|
1 |
A1 |
B1 |
C1 |
X1 |
Description1 |
2 |
A2 |
B2 |
C2 |
X2 |
Description2 |
3 |
A3 |
B3 |
C3 |
X3 |
Description3 |
RIGHT JOIN¶
SQL Server¶
Saída antes da consulta¶
Col1 |
Col2 |
Col3 |
Col4 |
Col5 |
Col6 |
|---|---|---|---|---|---|
1 |
A1 |
B1 |
C1 |
null |
null |
2 |
A2 |
B2 |
C2 |
null |
null |
3 |
A3 |
B3 |
C3 |
null |
null |
Saída após a consulta¶
Col1 |
Col2 |
Col3 |
Col4 |
Col5 |
Col6 |
|---|---|---|---|---|---|
1 |
A1 |
B1 |
C1 |
**X1 |
null |
2 |
A2 |
B2 |
C2 |
**X2 |
null |
3 |
A3 |
B3 |
C3 |
**X3 |
null |
Snowflake¶
Saída antes da consulta¶
Col1 |
Col2 |
Col3 |
Col4 |
Col5 |
Col6 |
|---|---|---|---|---|---|
1 |
A1 |
B1 |
C1 |
null |
null |
2 |
A2 |
B2 |
C2 |
null |
null |
3 |
A3 |
B3 |
C3 |
null |
null |
Saída após a consulta¶
Col1 |
Col2 |
Col3 |
Col4 |
Col5 |
Col6 |
|---|---|---|---|---|---|
1 |
A1 |
B1 |
C1 |
**X1 |
null |
2 |
A2 |
B2 |
C2 |
**X2 |
null |
3 |
A3 |
B3 |
C3 |
**X3 |
null |
Problemas conhecidos¶
Pode haver padrões que não podem ser convertidos devido a diferenças na lógica.
Se seu padrão de consulta se aplicar, examine as linhas não determinísticas: «Quando uma cláusula FROM contém uma cláusula JOIN entre tabelas (por exemplo,
t1et2), uma linha de destino emt1pode se unir a (ou seja, corresponder a) mais de uma linha na tabelat2. Quando isso ocorre, a linha de destino é chamada de multi-joined row. Ao atualizar uma linha com várias junções, o parâmetro de sessão ERROR_ON_NONDETERMINISTIC_UPDATE controla o resultado da atualização (Documentação do Snowflake).