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 / 167201
Accepted
andrerpena
andrerpena
Asked: 2017-03-15 16:10:54 +0800 CST2017-03-15 16:10:54 +0800 CST 2017-03-15 16:10:54 +0800 CST

O que significa [FROM x, y] no Postgres?

  • 772

Estou começando agora com o Postgres. Lendo este documento me deparei com esta consulta:

SELECT title, ts_rank_cd(textsearch, query) AS rank
FROM apod, to_tsquery('neutrino|(dark & matter)') query
WHERE query @@ textsearch
ORDER BY rank DESC
LIMIT 10;

Eu posso entender tudo nesta consulta, exceto isso: FROM apod, ....

O que isso ,significa? Estou acostumado a junções, mas não a várias FROMinstruções separadas por uma vírgula.

Procurei na net sem sucesso. Depois de olhar e pensar, me parece que está declarando uma variável chamada query para poder usá-la várias vezes. Mas se isso for verdade, o que isso tem a ver FROM?

postgresql join
  • 2 2 respostas
  • 5394 Views

2 respostas

  • Voted
  1. Erwin Brandstetter
    2017-03-15T20:47:46+08:002017-03-15T20:47:46+08:00

    O manual tem explicação detalhada para a vírgula na FROMlista no capítulo Expressões de Tabela :

    A FROMcláusula deriva uma tabela de uma ou mais outras tabelas fornecidas em uma lista de referência de tabela separada por vírgula.

    FROM table_reference [, table_reference [, ...]]

    Uma referência de tabela pode ser um nome de tabela (possivelmente qualificado pelo esquema) ou uma tabela derivada, como uma subconsulta, uma JOINconstrução ou combinações complexas delas. Se mais de uma referência de tabela estiver listada na FROMcláusula, as tabelas são unidas (ou seja, o produto cartesiano de suas linhas é formado; veja abaixo).

    O fato de as referências de tabela separadas por vírgula terem sido definidas em uma versão anterior do padrão SQL do que a JOINsintaxe explícita não torna a vírgula errada ou desatualizada. Use a sintaxe de junção explícita, onde for tecnicamente necessário (veja abaixo) ou quando tornar o texto da consulta mais claro.

    O manual novamente:

    FROM T1 CROSS JOIN T2é equivalente a FROM T1 INNER JOIN T2 ON TRUE (veja abaixo). Também é equivalente a FROM T1, T2.

    Há casos de canto em que ambos não são completamente equivalentes. O manual:

    Observação
    Esta última equivalência não é válida exatamente quando mais de duas tabelas aparecem, porque JOINvincula mais firmemente do que a vírgula. Por exemplo FROM T1 CROSS JOIN T2 INNER JOIN T3 ON condition, não é o mesmo que FROM T1, T2 INNER JOIN T3 ON conditionporque conditionpode fazer referência T1no primeiro caso, mas não no segundo.

    Esta questão relacionada demonstra a relevância da diferença:

    • “referência inválida à entrada da cláusula FROM para tabela” na consulta do Postgres

    Basicamente, sua observação está exatamente correta:

    parece-me que está declarando uma variável chamada query para que possa usá-la várias vezes.

    Qualquer função pode ser usada como "função de tabela" na FROMlista. E os parâmetros da função podem referenciar colunas de todas as tabelas à esquerda da função, porque a notação:

    FROM apod, to_tsquery('neutrino|(dark & matter)') query
    

    ... é realmente equivalente a:

    FROM apod CROSS JOIN LATERAL to_tsquery('neutrino|(dark & matter)') AS query
    

    O manual sobre consultas LATERAL:

    As funções de tabela que aparecem em FROMtambém podem ser precedidas pela palavra-chave LATERAL, mas para funções a palavra-chave é opcional ; os argumentos da função podem conter referências a colunas fornecidas pelos itens FROM anteriores em qualquer caso.

    Minha ênfase em negrito .

    A palavra- chaveAS é ruído completamente opcional antes de aliases de tabela (em oposição a aliases de coluna , onde é recomendado não omitir ASpara evitar possíveis ambiguidades). Ver:

    • Aritmética da coluna de data na consulta do PostgreSQL
    • 14
  2. Best Answer
    Evan Carroll
    2017-03-15T16:12:58+08:002017-03-15T16:12:58+08:00

    Ele cria um implícito CROSS JOIN. É a sintaxe SQL-89.

    Aqui eu uso values(1)e values(2)para criar pseduo-tables (tabelas de valores) meramente para exemplos. A coisa depois deles t(x), e g(y)são chamados de FROM-Aliases o caractere dentro dos parênteses é o alias para a coluna ( xe yrespectivamente). Você poderia facilmente criar uma tabela para testar isso.

    SELECT *
    FROM (values(1)) AS t(x), (values(2)) AS g(y)
    

    Aqui está como você escreveria agora.

    SELECT *
    FROM (values(1)) AS t(x)
    CROSS JOIN (values(2)) AS g(y);
    

    A partir daí, você pode tornar isso implícito INNER JOINadicionando uma condicional.

    SELECT *
    FROM (values(1)) AS t(x)
    CROSS JOIN (values(1)) AS g(z)
    WHERE x = z;
    

    INNER JOINOu a sintaxe explícita e mais recente ,

    SELECT *
    FROM (values(1)) AS t(x)
    INNER JOIN (values(1)) AS g(z)
      ON ( x = z );
    

    Então no seu exemplo..

    FROM apod, to_tsquery('neutrino|(dark & matter)') query
    

    Isso é essencialmente o mesmo que a sintaxe mais recente,

    FROM apod
    CROSS JOIN to_tsquery('neutrino|(dark & matter)') AS query
    

    que na verdade é o mesmo, neste caso, porque to_tsquery()retorna uma linha e não um conjunto como,

    SELECT title, ts_rank_cd(
      textsearch,
      to_tsquery('neutrino|(dark & matter)')
    ) AS rank
    FROM apod
    WHERE to_tsquery('neutrino|(dark & matter)') @@ textsearch
    ORDER BY rank DESC
    LIMIT 10;
    

    No entanto, o acima pode fazer to_tsquery('neutrino|(dark & matter)')com que ocorra duas vezes, mas neste caso não acontece -- to_tsqueryestá marcado como STABLE (verificado com \dfS+ to_tsquery).

    STABLEindica que a função não pode modificar o banco de dados e que, em uma única varredura de tabela, ela retornará consistentemente o mesmo resultado para os mesmos valores de argumento, mas que seu resultado pode mudar nas instruções SQL. Esta é a seleção apropriada para funções cujos resultados dependem de pesquisas de banco de dados, variáveis ​​de parâmetro (como o fuso horário atual), etc. A família de funções current_timestamp se qualifica como estável, pois seus valores não mudam em uma transação.

    Para uma comparação mais completa das diferenças entre SQL-89 e SQL-92, veja também minha resposta aqui

    • 12

relate perguntas

  • Qual é a diferença entre um INNER JOIN e um OUTER JOIN?

  • Os procedimentos armazenados impedem a injeção de SQL?

  • Como é a saída de uma instrução JOIN?

  • Sequências Biológicas do UniProt no PostgreSQL

  • Qual é a diferença entre a replicação do PostgreSQL 9.0 e o Slony-I?

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

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve