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)
| 归档时间: |
|
| 查看次数: |
11542 次 |
| 最近记录: |