2014-07-03 26 views
1

此查詢的工作:內上刪除查詢加入,節點JS,JS Knex

var query = knex('project_member') 
    .join('project', 'project_member.pm_project', '=', 'project.prj_id') 
    .join('users', 'project_member.pm_user', '=', 'users.us_id') 
    .where({ 
     prj_number: inputs.params.prj_number 
    }) 
    .select('pm_project', 'us_name', 'us_alias'); 

query.toString()給出:

select "pm_project", "us_name", "us_alias" from "project_member" inner join "project" on "project_member"."pm_project" = "project"."prj_id" inner join "users" on "project_member"."pm_user" = "users"."us_id" where "prj_number" = '4026305' 

該查詢不起作用:

var query = knex('project_member') 
    .join('project', 'project_member.pm_project', '=', 'project.prj_id') 
    .where({ 
     prj_number: inputs.params.prj_number, 
     pm_user: inputs.params.pm_user 
    }) 
    .del(); 

query.toString()給出:

delete from "project_member" where "prj_number" = '4026305' and "pm_user" = '1' 

不可能在刪除查詢時使用連接嗎?你我必須做一個單獨的查詢來加入它們嗎?

+0

你可以看到生成的SQL在互聯網上運行的潛在破壞性SQL之前備份您的數據? (從未使用knex,但可能通過設置['debug:true'](http://knexjs.org/#Installation-debug))? –

+0

用sql輸出更新了問題。 – Per

回答

1

似乎刪除連接無法正常工作(可能是由於各種數據庫的刪除連接語法不同),但您應該可以將查詢重寫爲簡單的IN查詢;

DELETE FROM project_member 
WHERE pm_user = <pm user> 
AND pm_project IN (
    SELECT prj_id FROM project WHERE prj_number = <prj_number> 
) 

...應該由(未經測試的)生成的...;

knex('project_member') 
    .where('pm_user', inputs.params.pm_user) 
    .whereIn('pm_project', function() { 
    this.select('prj_id') 
     .from('project') 
     .where('prj_number', inputs.params.prj_number); 
    }) 
    .del() 

...始終記得從隨機的人數據庫;-)

+1

作品!非常好。 Tackar! – Per