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 basándose en Table1.PhoneNumber1 -> Table2.PhoneNumber, o Table1.PhoneNumber2 -> Table2.PhoneNumber.
Ahora, quiero obtener un conjunto de resultados que contenga PhoneNumber1, SomeOtherField que corresponda a PhoneNumber1, PhoneNumber2 y SomeOtherField que corresponda a PhoneNumber2.
Pensé en 2 formas de hacer esto: uniéndome a la mesa dos veces o uniéndome una vez con un OR 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 tener de alguna manera una consulta que se parezca un poco a esto:
SELECT ...
FROM Table1
INNER JOIN Table2
ON Table1.PhoneNumber1 = Table2.PhoneNumber OR
Table1.PhoneNumber2 = Table2.PhoneNumber
No he logrado que esto funcione todavía y no estoy seguro de si hay una manera de hacerlo.
¿Cuál es la mejor manera de lograrlo? Ninguna de las dos parece simple o intuitiva ... ¿Existe una forma más sencilla de hacer esto? ¿Cómo se implementa este requisito en general?
La primera es buena 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 tener una tabla con dos campos de números de teléfono. Por lo general, esto significa que el diseño de su base de datos es defectuoso.
fuente
Podría usar
UNION
para combinar dos combinaciones:fuente
Mi problema fue 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 ningún correspondiente a la derecha. Para mí, esto funciona en Microsoft Access SQL (¡requieren el paréntesis!)
fuente
El primer método es el enfoque adecuado y hará lo que necesite. Sin embargo, con las combinaciones internas, solo seleccionará filas de
Table1
si ambos números de teléfono existen enTable2
. Es posible que desee hacer unaLEFT JOIN
para queTable1
se seleccionen todas las filas de . Si los números de teléfono no coinciden, laSomeOtherField
s sería nula. Si desea asegurarse de tener al menos un número de teléfono coincidente, puede hacerloWHERE t2.PhoneNumber IS NOT NULL OR t3.PhoneNumber IS NOT NULL
El segundo método podría tener un problema: ¿qué pasa si
Table2
tiene ambosPhoneNumber1
yPhoneNumber2
? ¿Qué fila se seleccionará? Dependiendo de sus datos, claves externas, etc., esto puede ser un problema o no.fuente