【问题标题】:Inner join on delete query, Node JS, Knex JS删除查询、Node JS、Knex JS 的内连接
【发布时间】:2014-08-24 07:19:52
【问题描述】:

此查询有效:

  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'

不能在删除查询上使用连接?我需要单独查询才能加入吗?

【问题讨论】:

  • 你能看到生成的SQL吗? (从未使用过 knex,但可能通过设置 debug: true)?
  • 用 sql 输出更新了问题。

标签: node.js postgresql knex.js


【解决方案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()

...并且永远记得备份您的数据,然后再从 Internet 上的随机人那里对您的数据库运行具有潜在破坏性的 SQL ;-)

【讨论】:

  • 有效!很不错。塔卡!
猜你喜欢
  • 1970-01-01
  • 2020-01-17
  • 2015-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多