8

このクエリは機能します:

  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'

削除クエリで結合を使用することはできませんか? それらに参加するには、別のクエリを作成する必要がありますか?

4

1 に答える 1

7

削除結合が正しく機能していないようですが (おそらく、さまざまなデータベースの削除結合構文が大きく異なるため)、クエリを単純な 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()

...そして、インターネット上の無作為な人々からあなたのデータベースに潜在的に破壊的なSQLを実行する前に、常にデータをバックアップすることを忘れないでください;-)

于 2014-07-03T11:02:55.500 に答える