Database
 sql >> Base de Dados >  >> RDS >> Database

Fundamentos de expressões de tabela, Parte 2 – Tabelas derivadas, considerações lógicas


No mês passado eu forneci uma base para expressões de tabela em T-SQL. Expliquei o contexto da teoria relacional e do padrão SQL. Expliquei como uma tabela em SQL é uma tentativa de representar uma relação da teoria relacional. Também expliquei que uma expressão relacional é uma expressão operando em uma ou mais relações como entradas e resultando em uma relação. Da mesma forma, no SQL, uma expressão de tabela é uma expressão que opera em uma ou mais tabelas de entrada e resulta em uma tabela. A expressão pode ser uma consulta, mas não precisa ser. Por exemplo, a expressão pode ser um construtor de valor de tabela, como explicarei mais adiante neste artigo. Também expliquei que nesta série, concentro-me em quatro tipos específicos de expressões de tabela nomeadas que o T-SQL oferece suporte:tabelas derivadas, expressões de tabela comuns (CTEs), exibições e funções com valor de tabela (TVFs) embutidas.

Se você trabalha com T-SQL há algum tempo, provavelmente se deparou com alguns casos em que teve que usar expressões de tabela ou foi de alguma forma mais conveniente em comparação com soluções alternativas que não as usam. Aqui estão apenas alguns exemplos de casos de uso que vêm à mente:
  • Crie uma solução modular dividindo tarefas complexas em etapas, cada uma representada por uma expressão de tabela diferente.
  • Misturar resultados de consultas agrupadas e detalhes, caso você decida não usar funções de janela para essa finalidade.
  • Processamento lógico de consultas manipula as cláusulas de consulta na seguinte ordem:FROM>WHERE>GROUP BY>HAVING>SELECT>ORDER BY. Como resultado, no mesmo nível de aninhamento, os aliases de coluna que você define na cláusula SELECT estão disponíveis apenas para a cláusula ORDER BY. Eles não estão disponíveis para o restante das cláusulas de consulta. Com expressões de tabela, você pode reutilizar aliases definidos em uma consulta interna em qualquer cláusula da consulta externa e, dessa forma, evitar a repetição de expressões longas/complexas.
  • As funções de janela podem aparecer apenas nas cláusulas SELECT e ORDER BY de uma consulta. Com expressões de tabela, você pode atribuir um alias a uma expressão com base em uma função de janela e, em seguida, usar esse alias em uma consulta na expressão de tabela.
  • Um operador PIVOT envolve três elementos:agrupamento, espalhamento e agregação. Este operador identifica o elemento de agrupamento implicitamente por eliminação. Usando uma expressão de tabela, você pode projetar exatamente os três elementos que deveriam estar envolvidos e fazer com que a consulta externa use a expressão de tabela como a tabela de entrada do operador PIVOT, controlando assim qual elemento é o elemento de agrupamento.
  • Modificações com TOP não suportam uma cláusula ORDER BY. Você pode controlar quais linhas são escolhidas indiretamente definindo uma expressão de tabela com base em uma consulta SELECT com o filtro TOP ou OFFSET-FETCH e uma cláusula ORDER BY e aplicar a modificação na expressão de tabela.

Esta está longe de ser uma lista exaustiva. Demonstrarei alguns dos casos de uso acima e outros nesta série. Eu só queria mencionar alguns casos de uso aqui para ilustrar a importância das expressões de tabela em nosso código T-SQL e por que vale a pena investir na compreensão de seus fundamentos.

No artigo deste mês, concentro-me especificamente no tratamento lógico de tabelas derivadas.

Em meus exemplos, usarei um banco de dados de exemplo chamado TSQLV5. Você pode encontrar o script que o cria e o preenche aqui, e seu diagrama ER aqui.

Tabelas derivadas


O termo tabela derivada é usado em SQL e T-SQL com mais de um significado. Então, primeiro quero deixar claro a qual estou me referindo neste artigo. Estou me referindo a uma construção de linguagem específica que você define normalmente, mas não apenas, na cláusula FROM de uma consulta externa. Fornecerei a sintaxe para essa construção em breve.

O uso mais geral do termo tabela derivada em SQL é a contrapartida de uma relação derivada da teoria relacional. Uma relação derivada é uma relação de resultado que é derivada de uma ou mais relações de base de entrada, aplicando operadores relacionais de álgebra relacional como projeção, interseção e outros a essas relações de base. Da mesma forma, no sentido geral, uma tabela derivada em SQL é uma tabela de resultados derivada de uma ou mais tabelas base, avaliando expressões em relação a essas tabelas base de entrada.

Como um aparte, verifiquei como o padrão SQL define uma tabela base e imediatamente me arrependi de ter me incomodado.
4.15.2 Tabelas básicas

Uma tabela base é uma tabela base persistente ou uma tabela temporária.

Uma tabela base persistente é uma tabela base persistente regular ou uma tabela com versão do sistema.

Uma tabela base regular é uma tabela base regular persistente ou uma tabela temporária.”

Adicionado aqui sem mais comentários…

No T-SQL, você pode criar uma tabela base com uma instrução CREATE TABLE, mas existem outras opções, por exemplo, SELECT INTO e DECLARE @T AS TABLE.

Aqui está a definição do padrão para tabelas derivadas no sentido geral:
4.15.3 Tabelas derivadas

Uma tabela derivada é uma tabela derivada direta ou indiretamente de uma ou mais outras tabelas pela avaliação de uma expressão, como uma , , ou . Uma pode conter uma opcional. A ordenação das linhas da tabela especificada pela é garantida apenas para a que contém imediatamente a .”

Há algumas coisas interessantes a serem observadas aqui sobre tabelas derivadas no sentido geral. Um tem a ver com o comentário sobre o pedido. Eu vou chegar a este mais tarde no artigo. Outra é que uma tabela derivada em SQL pode ser uma expressão de tabela autônoma válida, mas não precisa ser. Por exemplo, a expressão a seguir representa uma tabela derivada e é também considerada uma expressão de tabela autônoma válida (você pode executá-la):
SELECT custid, companynameFROM Sales.CustomersWHERE país =N'EUA'

Por outro lado, a seguinte expressão representa uma tabela derivada, mas não é uma expressão de tabela autônoma válida:
T1 INNER JOIN T2 ON T1.keycol =T2.keycol

O T-SQL oferece suporte a vários operadores de tabela que geram uma tabela derivada, mas não têm suporte como expressões autônomas. São eles:JOIN, PIVOT, UNPIVOT e APPLY. Você precisa de uma cláusula para que eles operem (normalmente FROM, mas também a cláusula USING da instrução MERGE) e uma consulta de host.

Daqui em diante, usarei o termo tabela derivada para descrever uma construção de linguagem mais específica e não no sentido geral descrito acima.

Sintaxe


Uma tabela derivada pode ser definida como parte de uma instrução SELECT externa em sua cláusula FROM. Ele também pode ser definido como parte das instruções DELETE e UPDATE em sua cláusula FROM e como parte de uma instrução MERGE em sua cláusula USING. Fornecerei mais detalhes sobre a sintaxe quando usada em instruções de modificação posteriormente neste artigo.

Aqui está a sintaxe para uma consulta SELECT simplificada em uma tabela derivada:
SELECT