Pergunta

Existe alguma diferença significativa entre o seguinte?

SELECT a.name, b.name FROM a, b WHERE a.id = b.id AND a.id = 1

e

SELECT a.name, b.name FROM a INNER JOIN b ON a.id = b.id WHERE a.id = 1

usuários

fazê-lo ter uma preferência de um sobre o outro?

Foi útil?

Solução

Não há nenhuma diferença, mas a legibilidade do segundo é muito melhor quando você tem um grande multi-consulta de junção com extra, onde cláusulas para filtragem.
Separando as cláusulas e as cláusulas de filtro de associação é uma coisa boa:)

Outras dicas

O primeiro é ANSI 89 sintaxe, o último é ANSI 92.

Para que específica consulta , não há diferença. No entanto, com o ex-lo a perder a capacidade de separar um filtro de uma condição de junção em consultas complexas, ea sintaxe para especificar LEFT vs DIREITO vs INNER é muitas vezes confusa, especialmente se você tem que ir e voltar entre diferentes fornecedores db. Eu não gosto da sintaxe mais antiga em tudo.

Não há diferença para o mecanismo de consulta SQL.

Para facilitar a leitura, o último é muito mais fácil de ler se você usar quebras de linha e recuo.

Para associações internas, não importa se você colocar "filtros" e "junta" em ON ou cláusula WHERE, o otimizador de consulta deve decidir o que fazer em primeiro lugar de qualquer maneira (ele pode optar por fazer um filtro de primeira, uma junção mais tarde , ou vice-versa

para as junções externas no entanto, há uma diferença, e às vezes você vai querer colocar a condição na cláusula ON, às vezes no WHERE. Colocar uma condição na cláusula WHERE de uma associação externa pode transformá-lo em um INNER JOIN (por causa de como nulos trabalho)

Por exemplo, verificar a legibilidade entre as duas amostras seguintes:

SELECT c.customer_no, o.order_no, a.article_no, r.price
FROM customer c, order o, orderrow r, article a
WHERE o.customer_id = c.customer_id
AND r.order_id = o.order_id
AND a.article_id = r.article_id
AND o.orderdate >= '2003-01-01'
AND o.orderdate < '2004-01-01'
AND c.customer_name LIKE 'A%'
ORDER BY r.price DESC 

vs

SELECT c.customer_no, o.order_no, a.article_no, r.price
FROM customer c 
INNER JOIN order o
   ON  o.customer_id = c.customer_id
   AND o.orderdate >= '2003-01-01'
   AND o.orderdate < '2004-01-01'
INNER JOIN orderrow r
   ON  r.order_id = o.order_id
INNER JOIN article a 
   ON  a.article_id = r.article_id
WHERE  c.customer_name LIKE 'A%'
ORDER BY r.price DESC 

Enquanto você pode executar a maioria das tarefas usando ambos e no seu caso, não há diferença alguma, eu sempre vou usar o segundo em todos os momentos.

  1. É o atual padrão suportado
  2. Ele mantém junta-se na cláusula FROM e filtros na cláusula WHERE
  3. Faz mais complexo ESQUERDA, DIREITA, FULL OUTER junta-se muito mais fácil
  4. MSSQL ajuda é tudo baseado em torno de que a sintaxe, portanto, muito mais fácil de obter ajuda em suas consultas de problemas

Enquanto não há diferença tecnicamente, você precisa ser extremamente cuidadoso sobre fazer junções usando o primeiro método. Se você errar por acidente, você pode acabar fazendo uma junção cartesiana entre as tabelas A e B (a, memória e cpu consulta muito tempo intensivo - ele irá corresponder cada única linha em uma com todas as linhas b Bad se a. e b são grandes mesas para começar). Usando um INNER JOIN explícitas é tanto mais seguro e mais fácil de ler.

Não há diferença. Acho que o primeiro formato mais legível e usar o segundo formato somente ao fazer outros tipos de junções (EXTERIOR, LEFT INNER, etc).

A segunda forma é SQL92 sintaxe compatível. Isso deve significar que ele é suportado por todos os bancos de dados fornecedores atuais e futuras. No entanto, a verdade é que a primeira forma é tão profundo que ele também está garantido para ser em torno de mais tempo do que nós nos importamos.

Caso contrário, eles são os mesmos em todos os aspectos na forma como os bancos de dados tratar os dois.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top