0

Quiero combinar 2 tablas con un INNER JOIN pero me encuentro con 2 sintaxis diferentes una donde despues colocan de esta manera:

INNER JOIN tabla_2 ON tabla_1_ID = tabla_2_ID

y la otra de esta manera, cambiando solo el where

INNER JOIN tabla_2 WHERE tabla_1_ID = tabla_2_ID

¿Cual seria la diferencia o harian los mismo?

Aetos2501
  • 549
  • 1
  • 7
  • 16
  • 1
    En esta pregunta de SO lo responden: https://stackoverflow.com/questions/1018822/inner-join-on-vs-where-clause – Kiko_L Apr 18 '18 at 19:37
  • Aparte de la diferencia sintáctica no hay ninguna otra, el uso de `ON` se considera un `JOIN` explícito y el otro es implícito. Es recomendable usar la primer forma. Ver: https://es.stackoverflow.com/questions/52530/cual-es-la-diferencia-entre-joins-impl%C3%ADcitos-y-expl%C3%ADcitos/53988#53988 – Patricio Moracho Apr 18 '18 at 19:44
  • El segundo `INNER JOIN` que pones marcaría error. Creo que te refieres más bien a una consulta con un `JOIN` implícito: `SELECT A.*, B.* FROM A, B WHERE A.Id = BId`. Además de que la declaración de `JOIN` de este tipo se consideró obsoleta en la conversación [SQL1992](https://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt) (**¡¡hace 26 años!!**). Debería considerarse una aberración continuar usando esta declaración pero aunque no lo creas, hay quien todavía las usa. – Phi Apr 18 '18 at 20:54

2 Answers2

1

INNER JOIN ON VS WHERE

Cuando haces uso de la instrucción ON, depende o es necesaria la presencia de INNER JOIN, y que será aplicable por ejemplo para indicar la relación de parentezco o similitud entre una tabla y otra, es decir la estas indicando en que columnas debe basarse para identificar si existe relación; te será muy útil cuando necesites hacer la relación o vinculación con mútiples tablas

Cuando haces uso de WHERE generalmente es para decirle que encuentre o vuelque la información de una consulta cuando exista una coincidencia, pero estará limitado por cuestiones de presentacion de la consulta, en el ejemplo sigueinte te muestro un caso de uso donde se aplican las 2; al hacer un inner join de la tabla users y la tabla posts para obtener todos los posts del usuario con id 2:

SELECT users.*, posts.* FROM posts
INNER JOIN users
ON users.id = posts.id_user
WHERE users.id = 2;

Recuerda que al hacer uso de alguna sentencia JOIN, es parte del algebra relacional que va a indicar una colección de resultados únicamente cuando la coincidencia que marca el join se presente

1

Si está hablando de resultados, no habrá muchas diferencias. Si habla de rendimiento, el motor de SQL Server es mucho más inteligente y reescribirá automáticamente su búsqueda en la mayoría de los casos, por lo que no tendrá diferencias en el rendimiento. Dicho esto, prefiero que uses INNER JOIN cuando una consulta involucra más de una tabla, ya que es la sintaxis válida de ANSI.

Si alguna vez vas a utilizar OUTER JOIN, la cuestión de JOIN vs WHERE no tiene ningún sentido, ya que la respuesta puede ser diferente en la mayoría de los casos.

Mira un ejemplo:

Suponiendo que tenemos estas dos tablas.

introducir la descripción de la imagen aquí

-- JOIN
SELECT s.SalesRep, o.Amount
FROM SalesRep s
INNER JOIN Orders o ON s.id = o.id
GO
-- WHERE
SELECT s.SalesRep, o.Amount
FROM SalesRep s, Orders o
WHERE s.id = o.id
GO

introducir la descripción de la imagen aquí

Observará en el conjunto de resultados que ambas consultas devuelven exactamente el mismo resultado. Como mencioné anteriormente cuando utilizamos la cláusula INNER JOIN y WHERE, no hay impacto del resultado si la condición JOIN y la cláusula WHERE tienen casi la misma condición.

Veamos un ejemplo rápido en el que la combinación externa proporciona resultados absolutamente diferentes en comparación con los casos en los que existe una lógica comercial totalmente diferente cuando se tiene que usar la combinación externa. Como mencioné anteriormente, es como comparar manzanas y naranjas si se compara la unión externa y la cláusula where. No son lo mismo lógicamente.

 -- JOIN
    SELECT s.SalesRep, o.Amount
    FROM SalesRep s
    LEFT OUTER JOIN Orders o ON s.id = o.id
    GO
    -- WHERE
    SELECT s.SalesRep, o.Amount
    FROM SalesRep s, Orders o
    WHERE s.id = o.id
    GO

introducir la descripción de la imagen aquí

Fuente: What is the Difference Between An INNER JOIN and WHERE Clause

J. Rodríguez
  • 5,205
  • 5
  • 29
  • 71