2015-02-06 2 views
8

У меня есть SQL-запрос, который ссылается на одну и ту же таблицу дважды, и мне нужно перечислить таблицу в два отдельных псевдонима. Я не могу понять, как составить это с Knex.Псевдоним таблицы в Knex

Существует таблица «Слова» и таблица «Пользователи». В таблице Words есть два внешних ключа: author_id и winner_id, ссылающиеся на столбец «id» таблицы «Пользователи».

Вот SQL я пытаюсь сочинять 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 

Я немного потерял о том, как сделать это в Knex. Моя первая попытка не включала aliasing, и поэтому я получил ошибку «таблица, используемая более одного раза». Когда я попытался использовать метод .as(), knex жаловался на отсутствие предложения .from(). Используется ли метод .as() для подзапросов псевдонимов, и я не должен ожидать, что он будет использоваться для таблиц псевдонимов?

ответ

26

Я думаю, что понял. В knex.js, скажем, указать таблицу, как:

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

Тогда вы можете просто добавить ключевое слово AS в котировках имени таблицы для псевдонима это, например, так:

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

..и вы можете сделать это и для имен столбцов; так что мой оригинальный SQL будет выглядеть в knex-земля:

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') 

Я предполагаю, что я запуталась наличием .в knex в() метод, который (насколько я в настоящее время понимаю) предназначается только для подзапросов , а не для псевдонимов таблиц или имен столбцов.

+0

Большое спасибо за обмен! –

-1

Сложность или метод .as() не только используется для подзапросов, но также может использоваться в именах и таблицах псевдонимов. В вашем случае вам нужно использовать псевдоним для своей таблицы, потому что вы дважды использовали таблицу. В вашей первой попытке он получил ошибку, потому что ваш SQL запутался. Путем добавления псевдонимов на стол, который используется дважды, вы дали ему идентификацию, что таблица ua.Users теперь отличается от таблицы uw.Users. Надеюсь, это тебе помогло.

+0

Я мог ошибаться, но это звучит немного как ваш ответ применительно к SQL в целом, но не конкретно knex.js. Я знаю, что мой SQL правильный, но я пытаюсь понять, как это будет выглядеть в knex-talk. –

+0

Как вы используете его для имен столбцов псевдонимов? '.column ('x'). as ('y')' aliases * table * to 'y', * not * 'x'. – mpen

+0

Это делается так же, как имена таблиц, и в моем ответе выше приведен пример столбцов псевдонимов. («Пользователи» - это имя столбца, и я накладываю его на «ua».) Извините за поздний ответ, ха! –

Смежные вопросы