|
我有一个SQL查询,该查询两次引用同一张表,因此我需要将该表别名为两个单独的别名。我不太清楚如何与Knex一起编写。% E0 Q U S5 B& N1 ^
有一个“单词”表和一个“用户”表。Words表具有两个外键,即“ author_id”和“ winner_id”,引用了Users表的“ id”列。
. ?0 M6 t$ C8 f/ |这是我要在Knex中编写的SQL:
9 g) |& Y# S3 l# \ E4 p' _SELECT w.*, ua.name, uw.name FROM Words AS w2 N! y+ F* I, z, z3 `
INNER JOIN Users AS ua ON w.author_id = ua.id ) f9 E/ h/ T, H) |9 O% w
LEFT JOIN Users AS uw ON w.winner_id = uw.id
" q* i7 Q8 E, L$ Z2 N1 B7 i1 l我对如何在Knex中做到这一点有些迷惑。我的第一次尝试不涉及别名,因此出现了“表使用多次”错误。当我尝试使用.as()方法时,knex抱怨缺少.from()子句。.as()方法仅用于别名子查询,我不应该期望它用于别名表吗?! V9 F- g* f* \" k' w
) {5 r1 S5 h) ] P
解决方案:
6 }# [) s/ w$ y" {& n2 ]: o 3 w: [+ C7 {6 U( d0 z
! d6 V% G% B# D& v4 b, v; o' I. L9 p" ^
有两种方法来声明标识符的别名(表或列)。一个人可以直接给标识符加上aliasName作为后缀(例如,identifierName作为aliasName),或者一个人可以传递一个对象{aliasName:’identifierName’}。
. f6 E5 M$ e/ S, _$ ]因此,以下代码:
; T; b P; y! U0 p knex.select('w.*', 'ua.name', 'uw.name')
0 ~3 s a0 e# z8 B" J7 N5 U8 U+ f .from({ w: 'Words' })
1 b9 K. v: T) l& h4 y! ] .innerJoin({ ua: 'Users' }, 'w.author_id', '=', 'ua.id')/ c4 ^* P3 C. h% X! d# T
.leftJoin({ uw: 'Users' }, 'w.winner_id', '=', 'uw.id')
, Y1 a( B8 S! y+ w2 { .toString()
, i, P p% [' e* y将编译为:& _- ^$ w9 M( E- n# ~# N) Y% K9 B/ e
select "w".*, "ua"."name", "uw"."name"9 m6 |' H* \. V/ M, y5 O I" D( Y
from "Words" as "w"# D+ N7 J. m" L+ R" }6 n r
inner join "Users" as "ua" on "w"."author_id" = "ua"."id"
& O. E2 E, v g3 o, J( cleft join "Users" as "uw" on "w"."winner_id" = "uw"."id" |
|