我希望在连接表时获得唯一的行

时间:2018-04-01 10:42:59

标签: postgresql

我在尝试加入3个表时运行以下查询:

select
  a.project_id, a.acc_name, a.project_name, a.iot,a.acc_id, a.active,
  b.app_fte, b.contact_person, c.cost_call_date
from
  Account a, Application b, account_version c
where
  a.acc_id in (Select acc_id from account where acc_name='GGG') and
  EXTRACT(MONTH FROM c.cost_call_date) = 3;

表中的样本数据如下:

 Account :
 acc_id  acc_name  iot  acc_contact  project_id  project_name  ilc_code  license_no  active
 2        GGG       NA    YYY         7777         HHH           TTR      766         false

 Application :
 app_id  app_name  app_fte  contact_person  acc_id
  1       sfsf       4       sdsdff          2

 Account_version :
 line_id  acc_id  version_no  chargable_fte  cost_call_date  is_approved
  9        2       7            4             2018-03-20

这里acc_id是Account表的主键和Application和Account_version表的外键。当我运行上面的查询时,我得到30行,我也尝试使用distinct关键字但仍然得到10行。请帮助我获得独特的行。

1 个答案:

答案 0 :(得分:0)

尝试这样的事情

SELECT DISTINCT a.project_id, a.acc_name, a.project_name, a.iot,a.acc_id, a.active, b.app_fte, b.contact_person, c.cost_call_date
FROM Account a
INNER JOIN Application b
    USING (acc_id)
INNER JOIN account_version c
    USING (acc_id)
WHERE a.acc_name = 'GGG'
AND EXTRACT(MONTH FROM c.cost_call_date) = 3

有关为什么您的查询为您提供的行数多于预期的参考,请尝试运行此命令:

SELECT a.*, b.*
FROM generate_series(1, 10) a, generate_series(1, 10) b

通过从多个表中进行选择,您所做的是cross join。您实际应该做的是获取所需行的内部联接,以及如果需要从结果中仅获取不同行的DISTINCT。