AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

    • Início
    • system&network
    • Ubuntu
    • Unix
    • DBA
    • Computer
    • Coding
    • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 230328
Accepted
youcantryreachingme
youcantryreachingme
Asked: 2019-02-21 14:52:41 +0800 CST2019-02-21 14:52:41 +0800 CST 2019-02-21 14:52:41 +0800 CST

Explicar uma cláusula OVER

  • 772

Eu vi uma instrução TSQL concisa que efetivamente divide uma string em seus caracteres constituintes, um por linha, com o objetivo de avaliar o asciivalor de cada caractere.

Se estou lendo a consulta corretamente, efetivamente, 3 CTEs estão sendo usados ​​para preparar uma tabela de 1 coluna contendo 10.000 linhas, cada uma com o valor '0'.

Um quarto CTE é definido da seguinte forma:

cteTally(n) AS(
    SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) n 
    FROM E4
)

Posteriormente, este CTE é associado a uma tabela contendo uma coluna com as strings de interesse, com o seguinte select:

SELECT n, SUBSTRING(LastName, n, 1), ASCII( SUBSTRING(LastName, n, 1))

Ou seja, o número da linha n, o enésimo caractere em LastName e o valor ascii desse caractere.

Minhas dúvidas se referem à overcláusula do CTE acima.

Essencialmente, o que exatamente ele está fazendo?

Se estamos consultando row_number de 10.000 linhas idênticas, por que precisamos de uma order bycláusula? Por que o put é order bycolocado em uma overcláusula e não como uma order bycláusula para a selectinstrução - especialmente porque a overcláusula nem especifica nenhuma partição? (Presumo que isso significa que a janela sobre a qual row_numberopera são as 10.000 linhas completas?) E o que significa ordenar select null?

sql-server t-sql
  • 2 2 respostas
  • 2334 Views

2 respostas

  • Voted
  1. Best Answer
    SQLRaptor
    2019-02-21T16:18:21+08:002019-02-21T16:18:21+08:00

    ROW_NUMBER() é uma função de janela de classificação, e as funções de janela de classificação requerem uma cláusula ORDER BY obrigatória. Se você tentar escrevê-lo sem o ORDER BY, receberá um erro de sintaxe.

    SELECT ROW_NUMBER() OVER()
    FROM (VALUES ('A'), ('B'), ('C')) AS X(Y);
    -- Msg 4112, Level 15, State 1, Line 1 
    -- The function 'ROW_NUMBER' must have an OVER clause with ORDER BY.
    

    O truque com a subconsulta foi descoberto por alguém que blogou sobre isso, como uma otimização de desempenho. O SQL Server sempre executa uma operação de classificação, pois as constantes não são permitidas para a cláusula ORDER BY:

    SELECT ROW_NUMBER() OVER(ORDER BY NULL)
    FROM (VALUES ('A'), ('B'), ('C')) AS X(Y);
    -- Msg 5309, Level 16, State 1, Line 1
    -- Windowed functions, aggregates and NEXT VALUE FOR functions 
    -- do not support constants as ORDER BY clause expressions.
    

    E nem são inteiros que são tratados como índices:

    SELECT ROW_NUMBER() OVER(ORDER BY 1)
    FROM (VALUES ('A'), ('B'), ('C')) AS X(Y);
    -- Msg 5308, Level 16, State 1, Line 1
    -- Windowed functions, aggregates and NEXT VALUE FOR functions 
    -- do not support integer indices as ORDER BY clause expressions.
    

    Acontece que devido a alguma falha no código, você pode contornar essa limitação usando uma subconsulta, que por algum motivo é permitida, e elimina o operador de classificação.

    SELECT ROW_NUMBER() OVER(ORDER BY (SELECT 1))
    FROM (VALUES ('A'), ('B'), ('C')) AS X(Y);
    

    Nenhum operador de classificação

    Você pode usar qualquer constante na subconsulta, o NULL é provavelmente uma reminiscência do hábito de usar SELECT NULL dentro de predicados EXISTS, que no início da história do SQL Server teve um impacto no desempenho em oposição a * ou qualquer outra expressão de coluna, como o otimizador não foi inteligente o suficiente para ignorá-lo.

    HTH

    UPDATE @Erik-Darling comentou que você também pode contornar isso usando expressões computadas:

    You can do SELECT ROW_NUMBER() OVER (ORDER BY 1/0);
    
    • 8
  2. HandyD
    2019-02-21T16:05:14+08:002019-02-21T16:05:14+08:00

    A cláusula OVER define a ordenação (e particionamento se PARTITION BY estiver incluído) do conjunto de linhas antes de aplicar a função de janela selecionada. Como você pode usar várias funções do Windows em uma única consulta, cada uma requer seu próprio particionamento e ordenação para garantir que os dados sejam retornados conforme desejado.

    No seu exemplo, ROW_NUMBER() está sendo usado para gerar um número de linha sequencial para cada linha no CTE. SELECT NULL é usado porque não há nenhuma ordem específica necessária, mas uma cláusula ORDER BY é necessária para uma função de janela.

    Outra maneira de conseguir a mesma coisa seria usar uma coluna IDENTITY, no entanto, que tem outras implicações e requer alterações em uma tabela existente ou a criação de uma tabela temporária. A função de janela ROW_NUMBER em um CTE permite que essa identidade seja gerada em tempo real.

    Para responder à sua pergunta específica:

    Essencialmente, o que exatamente ele está fazendo?

    Ele está ordenando as linhas em E4 'aleatoriamente' antes de aplicar a função de janela ROW_NUMBER() a esse conjunto de resultados para produzir uma lista de números de linha igual ao número de linhas em E4. OVER pode ser traduzido como "Busque-me um conjunto de resultados com esta ordenação e particionamento e aplique (OVER) esta função de janela a esse conjunto de resultados independente da ordenação na instrução SELECT principal".

    Mais informações: Cláusula OVER

    • 4

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help
subwaysurfers
my femboy roommate

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve