2015-02-06 13 views
8

Ho una query SQL che fa riferimento alla stessa tabella due volte e ho bisogno di alias la tabella in due alias separati. Non riesco a capire come comporlo con Knex.Alias ​​una tabella in Knex

C'è una tabella "Parole" e una tabella "Utenti". La tabella Words ha due chiavi esterne, 'author_id' e 'winner_id', che fa riferimento alla colonna 'id' della tabella Users.

Ecco lo SQL che sto cercando di comporre in Knex:

SELECT w.*, ua.name, uw.name FROM Words AS w 
INNER JOIN Users AS ua ON w.author_id = ua.id 
LEFT JOIN Users AS uw ON w.winner_id = uw.id 

io sono un po 'perso su come fare questo in Knex. Il mio primo tentativo non ha riguardato l'aliasing, quindi ho ricevuto un errore "table used than than once". Quando ho provato ad usare il metodo .as(), knex si è lamentato della mancanza di una clausola .from(). Il metodo .as() è utilizzato solo per le sottoquery aliasing e non dovrei aspettarmi che venga utilizzato per le tabelle alias?

risposta

26

Penso di aver capito. In knex.js, dite si specifica una tabella come:

knex.select('*').from('Users')

Poi si può solo aggiungere l'AS parola chiave all'interno delle citazioni del nome della tabella di alias che, in questo modo:

knex.select('*').from('Users AS u')

.. e puoi farlo anche per i nomi delle colonne; quindi il mio SQL originale sarebbe simile a questa in knex-terra:

knex.select('w.*', 'ua.name AS ua_name', 'uw.name AS uw_name') 
    .innerJoin('Users AS ua', 'author_id', 'ua.id') 
    .leftJoin('Users as uw', 'winner_id', 'uw.id') 

Credo che mi sono confuso dalla presenza di .as di knex() metodo, che (per quanto ho attualmente capito) è da intendersi per subqueries , non per tabelle di alias o nomi di colonne.

+0

Mille grazie per la condivisione! –

-1

Aliasing o il metodo .as() non viene utilizzato solo per subquery, esso può essere utilizzato anche in nomi di colonna aliasing e tabelle. Nel tuo caso devi usare alias al tuo tavolo perché hai usato la tabella due volte. Nel tuo primo tentativo, ha avuto un errore perché il tuo SQL si è confuso. Inserendo due alias sul tavolo che viene utilizzato due volte, viene indicato che la tabella ua.Users è ora diversa dalla tabella uw.Users. Spero ti abbia aiutato.

+0

Potrei sbagliarmi, ma suona un po 'come la tua risposta si applica a SQL in generale, ma non specificamente knex.js. So che il mio SQL è corretto, ma sto cercando di capire come sarebbe espresso in knex-speak. –

+0

Come si usa per alias nomi di colonne? '.column ('x'). as ('y')' alias la * tabella * in 'y', * not * 'x'. – mpen

+0

Viene eseguito allo stesso modo dei nomi di tabelle e nella mia risposta sopra c'è un esempio di colonne di aliasing. ("Utenti" è un nome di colonna e lo sto facendo aliasing a "ua".) Scusa per la risposta tardiva, ha! –

Problemi correlati