Isso é um pouco complicado, mas tenho 2 tabelas. Digamos que a estrutura seja mais ou menos assim:
*Table1*
ID
PhoneNumber1
PhoneNumber2
*Table2*
PhoneNumber
SomeOtherField
As tabelas podem ser unidas com base em Table1.PhoneNumber1 -> Table2.PhoneNumber ou Tabela1.PhoneNumber2 -> Table2.PhoneNumber.
Agora, quero obter um conjunto de resultados que contém PhoneNumber1, SomeOtherField que corresponda a PhoneNumber1, PhoneNumber2 e SomeOtherField que corresponda a PhoneNumber2.
Pensei em 2 maneiras de fazer isso - juntando-se à mesa duas vezes ou juntando-se uma vez com OR na 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
Isso parece funcionar.
Método 2 :
Para de alguma forma ter uma consulta que se parece um pouco com isto -
SELECT ...
FROM Table1
INNER JOIN Table2
ON Table1.PhoneNumber1 = Table2.PhoneNumber OR
Table1.PhoneNumber2 = Table2.PhoneNumber
Ainda não fiz isso funcionar e não tenho certeza se há uma maneira de fazer isso.
Qual é a melhor maneira de fazer isso? Nenhuma das formas parece simples ou intuitiva ... Existe uma maneira mais direta de fazer isso? Como esse requisito é geralmente implementado?
O primeiro é bom, a menos que Phone1 ou (mais provavelmente) phone2 possa ser nulo. Nesse caso, você deseja usar uma junção à esquerda em vez de uma junção interna.
Geralmente é um mau sinal quando você tem uma mesa com dois campos de número de telefone. Normalmente, isso significa que o design do seu banco de dados é falho.
fonte
Você pode usar
UNION
para combinar duas junções:fonte
Meu problema era exibir o registro mesmo que não houvesse ou existisse apenas um número de telefone (catálogo de endereços completo). Portanto, usei um LEFT JOIN que pega todos os registros da esquerda, mesmo que nenhum correspondente exista à direita. Para mim, isso funciona no Microsoft Access SQL (eles exigem o parêntese!)
fonte
O primeiro método é a abordagem adequada e fará o que você precisa. No entanto, com as junções internas, você só selecionará as linhas de
Table1
se ambos os números de telefone existirem emTable2
. Você pode querer fazer umLEFT JOIN
para que todas as linhas deTable1
sejam selecionadas. Se os números de telefone não corresponderem, oSomeOtherField
s será nulo. Se você quiser ter certeza de que tem pelo menos um número de telefone correspondente, você pode fazerWHERE t2.PhoneNumber IS NOT NULL OR t3.PhoneNumber IS NOT NULL
O segundo método pode ter um problema: o que acontece se
Table2
tiverPhoneNumber1
ePhoneNumber2
? Qual linha será selecionada? Dependendo de seus dados, chaves estrangeiras, etc., isso pode ou não ser um problema.fonte