2015-02-06 59 views
8

我有一個SQL查詢引用同一個表兩次,我需要將該表別名爲兩個單獨的別名。我不能完全弄清楚如何與Knex合作。在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 

我有點失去了對如何做到這一點的Knex。我的第一次嘗試沒有涉及別名,所以我得到了一個「表使用多次」的錯誤。當我嘗試使用.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

非常感謝分享! – 2017-01-20 21:57:00

-1

別名.as()方法不僅用於子查詢,它也可以用於別名列表和表中。在你的情況下,你需要使用表的別名,因爲你使用了兩次表。在你的第一次嘗試中,它因爲你的SQL感到困惑而得到一個錯誤。通過在使用兩次的表上放置一個別名,您給它一個表,ua.Users表現在與uw.Users表不同。希望它對你有所幫助。

+0

我可能是錯的,但它聽起來有點像你的答案一般適用於SQL,但不是特別的knex.js.我知道我的SQL是正確的,但我試圖找出它在knex-speak中表達的樣子。 – 2015-02-06 02:29:38

+0

你如何使用它來別名列名? '.column('x')。as('y')'將* table *別名爲'y',* not *'x'。 – mpen 2016-05-04 22:02:37

+0

它和表名一樣,在上面的答案中有一個別名列的例子。 (「用戶」是一個專欄名稱,我將它別名爲「ua」。)對不起,回覆遲了,哈! – 2017-10-19 16:29:34