WHERE语句在JOIN上有重复的列名 - PostgreSQL

时间:2017-03-27 12:25:47

标签: sql postgresql knex.js

我正在尝试加入两个表,一个计划表和一个 plan_details 表。以下是表格的两个示例。

计划表

+---------+------+-----------+
| user_id | plan | is_active |
+---------+------+-----------+
|  1      |  10  |    true   |
|  1      |  11  |   false   |
|  2      |  11  |    true   |

PLAN_DETAILS表

+---------+------+-------+-----------+
| plan_id | cost | price | is_active |
+---------+------+-------+-----------+
|  10     |  19  |  199  |    true   |
|  11     |  13  |  149  |    true   |

我只想提取与每个用户相关的有效计划费用价格。现在,我的knex声明是:

knex('plans')
  .where({
    user_id: 1,
    is_active: 'true'
  })
  .select(
    'plans.plan',
    'plan_details.cost',
    'plan_details.price'
  )
  .join('plan_details as plan_details', 'plan_details.plan_id', 'plans.plan')
  .then(function (user_plan_id) {
    console.log(user_plan_id);
  });

现在,如果我将is_active: 'true'保留在那里,那么我会得到一个Unhandled rejection error: column reference "is_active" is ambiguous。如果我取出is_active部分,那么我就会获得引用该用户的两个计划的信息,即使我只想知道哪些计划对用户有效。

如何仅为用户获取有效计划?我使用KNEX.JS作为我的ORM,但我很乐意使用原始SQL。

2 个答案:

答案 0 :(得分:1)

使用knex,应该这样做:

knex('plans')
  .select(
    'plans.plan',
    'plan_details.cost',
    'plan_details.price'
  )
  .join('plan_details as plan_details', 'plan_details.plan_id', 'plans.plan')
  .where('plan.user_id', 1)
  .where('plan.is_active', true)
  .then(function (user_plan_id) {
    console.log(user_plan_id);
  });

答案 1 :(得分:0)

SQL类似于:

select 
  plans.plan,
  plan_details.cost,
  plan_details.price
from plan
join plan_details on plans.plan = plan_details.plan_id
where plan.is_active