2013-09-04 9 views
5

ho una query di esempio con chiazza di petrolio come di seguito:vogliono conoscere meglio modo di unire le tabelle con chiazza di petrolio

val query = 
    (for { 
    (company,loc) <- Company leftJoin Location on (_.locId === _.id) 
    (_,typeof) <- Company leftJoin Types on (_.typeId === _.id) 
    } yield (company, loc, typeof)) 

è un modo migliore per fare più si unisce?

Ho provato i suggerimenti in multiple joins with slick ma si sono verificati errori.

+0

Cosa intendi per via migliore? Cosa c'è di male in questo? –

+0

Ho visto la query generata generare più query sulla stessa tabella società due volte e unirmi una volta con la posizione e una volta con il tipo. Normalmente con sql avviene in una query più join. Vuoi sapere se c'è qualcosa di sbagliato in questo. – dsr301

risposta

4

Questo sta lavorando bene.

for { 
    ((company,geo),typeof) <- Company 
     leftJoin Location on (_.locId === _.id) 
     leftJoin Business_Levels on (_._1.typeId === _.id) 
} 
+0

Questo risponde alla tua domanda, giusto? Si prega di contrassegnarlo come risposta in questo caso :). Grazie – cvogt

2

È possibile concatenare il join normalmente:

for { 
    (company, location, type) <- Company 
     leftJoin Location on (_.locId === _.id) 
     leftJoin Types on (_._1.typeId === _.id) 
} yield (company, location, type) 

E, a proposito, sono abbastanza sicuro la parola type è una parola scala riservata.

MODIFICA: è stato aggiunto _.1 alla riga 3 dopo il commento di dsr301.

+0

sì, tipo è una parola chiave, il post non ha nomi originali per alcuni motivi. in qualsiasi modo lo ha cambiato. Mi dà errore di compilazione con quello che hai menzionato sopra. ')' previsto ma '.' trovato. a (_.typeId === _.id) – dsr301

+0

Dopo aver modificato la query completa in un unico errore, "typeId non è un membro di (models.company.type, models.Location.type)". Penso che per il secondo join venga eseguita la tupla generata dal primo join – dsr301

+0

Modificata la mia risposta. –

Problemi correlati