unidad studio reales proyectos programacion para libro introducción incluye herramientas fundamentos fuente español desarrollo código con avanzado aplicaciones sql join

sql - studio - ¿Cuál es la mejor manera de unirse a la misma mesa dos veces?



manual android studio avanzado (5)

El primer método es el adecuado y hará lo que necesite. Sin embargo, con las combinaciones internas, solo seleccionará las filas de la Table1 si ambos números de teléfono existen en la Table2 . Es posible que desee hacer una LEFT JOIN para que se seleccionen todas las filas de la Table1 . Si los números de teléfono no coinciden, entonces SomeOtherField s sería nulo. Si quiere asegurarse de tener al menos un número de teléfono coincidente, puede hacer WHERE t2.PhoneNumber IS NOT NULL OR t3.PhoneNumber IS NOT NULL

El segundo método podría tener un problema: ¿qué sucede si Table2 tiene PhoneNumber1 y PhoneNumber2 ? ¿Qué fila será seleccionada? Dependiendo de sus datos, claves externas, etc. esto puede o no ser un problema.

Esto es un poco complicado, pero tengo 2 tablas. Digamos que la estructura es algo como esto:

*Table1* ID PhoneNumber1 PhoneNumber2 *Table2* PhoneNumber SomeOtherField

Las tablas se pueden unir según Table1.PhoneNumber1 -> Table2.PhoneNumber, o Table1.PhoneNumber2 -> Table2.PhoneNumber.

Ahora, quiero obtener un conjunto de resultados que contiene PhoneNumber1, SomeOtherField que corresponde a PhoneNumber1, PhoneNumber2 y SomeOtherField que corresponde a PhoneNumber2.

Pensé en 2 maneras de hacerlo, ya sea uniéndome a la mesa dos veces, o uniéndome una vez con un quirófano en la cláusula ON.

Método 1 :

SELECT t1.PhoneNumber1, t1.PhoneNumber2, t2.SomeOtherFieldForPhone1, t3.someOtherFieldForPhone2 FROM Table1 t1 INNER JOIN Table2 t2 ON t2.PhoneNumber = t1.PhoneNumber1 INNER JOIN Table2 t3 ON t3.PhoneNumber = t1.PhoneNumber2

Esto parece funcionar

Método 2 :

Para de alguna manera tener una consulta que se parece un poco a esto:

SELECT ... FROM Table1 INNER JOIN Table2 ON Table1.PhoneNumber1 = Table2.PhoneNumber OR Table1.PhoneNumber2 = Table2.PhoneNumber

Todavía no he conseguido que esto funcione y no estoy seguro de si hay alguna manera de hacerlo.

¿Cuál es la mejor manera de lograr esto? De ninguna manera parece simple o intuitiva ... ¿Hay una manera más directa de hacer esto? ¿Cómo se implementa generalmente este requisito?


El primero es bueno a menos que Phone1 o (más probablemente) phone2 puedan ser nulos. En ese caso, desea utilizar una combinación izquierda en lugar de una combinación interna.

Por lo general, es una mala señal cuando tienes una tabla con dos campos de números telefónicos. Por lo general, esto significa que el diseño de su base de datos es defectuoso.


Mi problema era mostrar el registro incluso si no existe o solo existe un número de teléfono (libreta de direcciones completa). Por lo tanto, utilicé un LEFT JOIN que toma todos los registros de la izquierda, incluso si no existe el correspondiente a la derecha. Para mí, esto funciona en Microsoft Access SQL (¡requieren el paréntesis!)

SELECT t.PhoneNumber1, t.PhoneNumber2, t.PhoneNumber3 t1.SomeOtherFieldForPhone1, t2.someOtherFieldForPhone2, t3.someOtherFieldForPhone3 FROM ( ( Table1 AS t LEFT JOIN Table2 AS t3 ON t.PhoneNumber3 = t3.PhoneNumber ) LEFT JOIN Table2 AS t2 ON t.PhoneNumber2 = t2.PhoneNumber ) LEFT JOIN Table2 AS t1 ON t.PhoneNumber1 = t1.PhoneNumber;


Primero, trataría de refactorizar estas tablas para evitar usar números telefónicos como claves naturales. No soy fan de las teclas naturales y este es un gran ejemplo de por qué. Las claves naturales, especialmente las cosas como los números de teléfono, pueden cambiar y con frecuencia. Actualizar su base de datos cuando ocurra ese cambio será un ENORME, propenso a errores. *

Sin embargo, el Método 1 tal como lo describes es tu mejor opción. Parece un poco escueto debido al esquema de nombres y los alias cortos, pero ... aliasing es tu amigo cuando se trata de unirte a la misma tabla varias veces o usar subconsultas, etc.

Limpiaría las cosas un poco:

SELECT t.PhoneNumber1, t.PhoneNumber2, t1.SomeOtherFieldForPhone1, t2.someOtherFieldForPhone2 FROM Table1 t JOIN Table2 t1 ON t1.PhoneNumber = t.PhoneNumber1 JOIN Table2 t2 ON t2.PhoneNumber = t.PhoneNumber2

Lo que hice:

  • No es necesario especificar INNER - está implícito en el hecho de que no especifica IZQUIERDA o DERECHA
  • No agregue n-sufijo a su tabla de búsqueda principal
  • N-Sufijo los alias de tabla que usará varias veces para que sea obvio

* Una forma en que los administradores de bases de datos evitan los dolores de cabeza de actualizar las claves naturales es no especificar claves primarias y restricciones de claves externas que agravan aún más los problemas con un diseño de base de datos deficiente. De hecho, he visto esto más a menudo que no.


Puede usar UNION para combinar dos uniones:

SELECT Table1.PhoneNumber1 as PhoneNumber, Table2.SomeOtherField as OtherField FROM Table1 JOIN Table2 ON Table1.PhoneNumber1 = Table2.PhoneNumber UNION SELECT Table1.PhoneNumber2 as PhoneNumber, Table2.SomeOtherField as OtherField FROM Table1 JOIN Table2 ON Table1.PhoneNumber2 = Table2.PhoneNumber