Como posso associar várias tabelas SQL usando os IDs?

141

Eu tenho 4 tabelas diferentes nas quais quero entrar. As tabelas estão estruturadas com colunas da seguinte maneira:

TableA - aID | nameA | dID

TableB - bID | nameB | cID | aID

TableC - cID | nameC | date

TableD - dID | nameD

Começando com a Tabela A, entendo como JOIN as tabelas a e c usando b, uma vez que b possui as Chaves Primárias para essas tabelas. Também quero ingressar na tabela TableD na tabela A. Abaixo está minha instrução SQL que primeiro une as tabelas A e B e depois associa isso a C:

SELECT TableA.*, TableB.*, TableC.* FROM (TableB INNER JOIN TableA
ON TableB.aID= TableA.aID)
INNER JOIN TableC ON(TableB.cID= Tablec.cID)
WHERE (DATE(TableC.date)=date(now())) 

Quando tento adicionar outra associação, para incluir D, recebo um erro que 'TableD' é desconhecido:

 SELECT TableA.*, TableB.*, TableC.*, TableD.* FROM (TableB INNER JOIN TableA
    ON TableB.aID= TableA.aID)
    INNER JOIN TableC ON(TableB.cID= Tablec.cID)
    INNER JOIN TableA ta ON(ta.dID= TableD.dID)
    WHERE (DATE(TableC.date)=date(now())) 
Sol
fonte

Respostas:

302

Você quer algo mais parecido com isto:

SELECT TableA.*, TableB.*, TableC.*, TableD.*
FROM TableA
    JOIN TableB
        ON TableB.aID = TableA.aID
    JOIN TableC
        ON TableC.cID = TableB.cID
    JOIN TableD
        ON TableD.dID = TableA.dID
WHERE DATE(TableC.date)=date(now()) 

No seu exemplo, você não está realmente incluindo TableD. Tudo o que você precisa fazer é realizar outra associação, como você fez antes.

Uma observação: você notará que eu removi muitos dos seus parênteses, pois eles realmente não são necessários na maioria dos casos que você os possuía, e apenas adiciona confusão ao tentar ler o código. O aninhamento adequado é a melhor maneira de tornar seu código legível e separado.

Justin Pihony
fonte
2
não seleciona a tabela N. * duplicar todos os IDs de chave primária correspondentes nos rótulos da coluna? (pergunta não especificou qual saída é desejado, mas normalmente você não iria querer fazer isso eu acho)
Heather Stark
6
Posso perguntar por que o JOINTableCé ON TableC.cID = TableB.cIDe não TableC.cID = TableA.cID. Presumi que estamos nos juntando TableAàs outras 3 mesas.
emihir0
25
SELECT 
    a.nameA, /* TableA.nameA */
    d.nameD /* TableD.nameD */
FROM TableA a 
    INNER JOIN TableB b on b.aID = a.aID 
    INNER JOIN TableC c on c.cID = b.cID 
    INNER JOIN TableD d on d.dID = a.dID 
WHERE DATE(c.`date`) = CURDATE()
Nemoden
fonte
4

Você não ingressou na TableD, apenas selecionou o TableD FIELD ( dID) de uma das tabelas.

Chriseyre2000
fonte
2

Código INNER JOIN VIEW simples ....

CREATE VIEW room_view
AS SELECT a.*,b.*
FROM j4_booking a INNER JOIN j4_scheduling b
on a.room_id = b.room_id;
Manu RS
fonte
Não está usando a estrutura da tabela do OP ?!
Istiaque Ahmed