删除查询的内部连接、Node JS、Knex JS

Joe*_*Joe 7 postgresql node.js knex.js

此查询有效:

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

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

此查询不起作用:

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

query.toString() 给出:

delete from "project_member" where "prj_number" = '4026305' and "pm_user" = '1'
Run Code Online (Sandbox Code Playgroud)

无法在删除查询上使用连接?你我必须单独查询才能加入他们吗?

Joa*_*son 6

似乎删除连接不能正常工作(可能是由于各种数据库的删除连接语法非常不同),但您应该能够将查询重写为简单的 IN 查询;

DELETE FROM project_member
WHERE pm_user = <pm user>
AND pm_project IN (
  SELECT prj_id FROM project WHERE prj_number = <prj_number>
)
Run Code Online (Sandbox Code Playgroud)

...应该由(未经测试的)生成;

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

...并且始终记得在您的数据库上运行来自 Internet 上随机人员的潜在破坏性 SQL 之前备份您的数据 ;-)