别名Knex中的表

Bob*_*ldo 19 sql inner-join left-join knex.js

我有一个SQL查询,它引用同一个表两次,我需要将表别名为两个单独的别名.我无法弄清楚如何用Knex来构建它.

有一个'Words'表和'Users'表.Words表有两个外键,'author_id'和'winner_id',引用Users表的'id'列.

这是我想在Knex中编写的SQL:

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
Run Code Online (Sandbox Code Playgroud)

我在Knex如何做到这一点有点迷茫.我的第一次尝试没有涉及别名,所以我得到了一个"不止一次使用"的错误.当我尝试使用.as()方法时,knex抱怨缺少.from()子句..as()方法是否仅用于别名子查询,我不应该期望它用于别名表吗?

Bob*_*ldo 53

我想我明白了.在knex.js中,假设您指定一个表,如:

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

然后你可以在表名的引号中添加AS关键字来对其进行别名,如下所示:

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

..你也可以为列名做这个; 所以我的原始SQL在knex-land中看起来像这样:

    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' )
Run Code Online (Sandbox Code Playgroud)

我想我对knex的.as()方法的存在感到困惑,该方法(据我目前所理解)仅用于子查询,而不是用于别名表或列名.


小智 17

两种方法可以为标识符(表或列)声明别名。可以直接为标识符提供 aliasName 后缀(例如 identifierName 作为 aliasName),或者可以传递一个对象 { aliasName: 'identifierName' }。

所以,下面的代码:

 knex.select('w.*', 'ua.name', 'uw.name')
  .from({ w: 'Words' })
  .innerJoin({ ua: 'Users' }, 'w.author_id', '=', 'ua.id')
  .leftJoin({ uw: 'Users' }, 'w.winner_id', '=', 'uw.id')
  .toString()
Run Code Online (Sandbox Code Playgroud)

将编译为:

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"
Run Code Online (Sandbox Code Playgroud)

  • 2020 更新 - 当我最初问这个问题时,我不确定 Knex 中是否存在这种机制,但现在这似乎是为表别名的正确方法。谢谢! (2认同)