with-Organize Complex Queries

with-Organize Complex Queries

In software engineering, it is common practice to group instructions as small and easily comprehensive units—namely functions or methods. Isto torna o código reutilizável e melhora a legibilidade.

embora SQL também tenha funções e procedimentos, eles não são as ferramentas certas para construir unidades facilmente compreensíveis e reutilizáveis. Em SQL, nem funções nem procedimentos são cidadãos de primeira classe da mesma forma que subquotas são.0 o bloco de construção do SQL são queries1—Não instruções.,

para tornar as consultas reutilizáveis, o SQL-92 introduziu pontos de vista. Uma vez criado, uma vista tem um nome no esquema de banco de dados para que outras consultas podem usá-lo como uma tabela.

SQL:1999 added the with clause to definite “statement scoped views”. Eles não são armazenados no esquema de banco de dados: em vez disso, eles são apenas válidos na consulta a que pertencem. Isso torna possível melhorar a estrutura de uma declaração sem poluir o espaço de nomes global.,

Sintaxe

with cláusula é, simplesmente, um prefixo opcional para select:2

WITH query_name (column_name1, ...) AS (SELECT ...) SELECT ...

A sintaxe após a palavra-chave with é o mesmo para o de create view: inicia-se com o nome da consulta, e optionally3 e, em parênteses, o nome das colunas que ele retorna. A palavra-chave as finalmente introduz a própria definição (a consulta)—novamente entre parênteses.,

With não é um autônomo de comandos como create view é: ele deve ser seguido por select. Esta consulta (e subqueries que contém) pode referir-se ao nome da consulta apenas definido em seu from cláusula.

com Um único with cláusula pode introduzir vários nomes de consulta separando-os com uma vírgula (with palavra-chave não é repetida)., Cada uma destas consultas, pode referir-se à consulta de nomes previamente definido dentro do mesmo with clause4 (que muitas vezes é negligenciado regra—consulte Compatibilidade):

WITH query_name1 AS ( SELECT ... ) , query_name2 AS ( SELECT ... FROM query_name1 ... )SELECT ...

Consulta nomes definidos usando with máscara de tabelas existentes ou pontos de vista com o mesmo nome.5

considerações de desempenho

a maioria dos processos de bases de dados with-consultas da mesma forma que processam visões: elas substituem a referência à consulta por sua definição e otimizam a consulta geral.,

a base de dados PostgreSQL era diferente até a versão 12: ele otimizou cada id

consulta e a principal declaração independente uma da outra.

If a with query is referred to multiple times, some databases cache (i.e. “materialize”) its result to prevent double execution.

Read more about this in “with Clause: Performance Impacts”.ganho a vida a partir da formação, de outros serviços relacionados com a SQL e da venda do meu livro. Saiba mais em https://winand.at/.,

Casos de Uso

  • Alfabetizados SQL

  • testes de Unidade em transiente de dados

  • Atribuir nomes às colunas sem um nome conhecido

Compatibilidade

O with cláusula foi introduzido com o SQL:1999, como um conjunto de recursos opcionais. Deixando o recursive variante de lado, os recursos são T121 para nível superior with cláusulas e T122 para with cláusulas em subconsultas.

a funcionalidade básica de with é bem suportada., A única área em que os produtos se comportam de forma diferente é a resolução de nomes. It is especially noteworthy that with is often treated like with recursive.6 O mais sutil incompatibilidades estão relacionadas com nomes de tabela qualificado (schema.table não pode se referir a uma with consulta)7 e vistas utilizadas no âmbito da with consulta (consulta dentro do modo de exibição não “ver” o exterior with cláusula).,8

alternativas conformes

As opiniões podem abranger alguns dos casos de Utilização. No entanto, isso pode facilmente levar a um número irrazoável de pontos de vista (“poluição de espaços de nomes”). Nesses casos, as subcontas são muitas vezes a melhor opção.

extensões proprietárias

com prefixo DML (PostgreSQL, SQL Server, SQLite)

algumas bases de dados aceitam with como prefixo para declarações DML (docs: PostgreSQL, SQL Server, SQLite).,

SQL Server can also use a with query as a target for DML statements (basically building an updatable view).

Functions in with (Oracle)

The Oracle Database supports function and procedure declarations within the with clause since version 12cR1 (documentation).

DML com (PostgreSQL)

Começando com 9.1, o banco de dados PostgreSQL suporta instruções DML (insert update delete) dentro do corpo de with consultas (documentação)., Ao usar a cláusula (também proprietária) returning da declaração DML, a opção with consulta devolve de facto os dados (por exemplo, as linhas que acabaram de ser inseridas).

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *