选择连接表中包含条件的记录或不存在于连接表

时间:2018-01-21 10:31:30

标签: sql postgresql join

我在Postgres 9.5数据库中有以下表格:

rate_adjust

Column     | Type    | Modifiers
-----------+---------+----------------------------------------------
id         | integer | not null default nextval('product_days_id_seq'::regclass)
name       | text    |
amount     | integer |
product_id | integer | 
type       | integer |
 Indexes:
"pk_product_days" PRIMARY KEY, btree (id)

factor_calendar

 Column         |            Type             |                       Modifiers
----------------+-----------------------------+-----------------------------------------------------
id              | integer                     | not null default nextval('product_id_seq'::regclass)
from_day        | integer                     |
thru_day        | integer                     |
created_at      | timestamp without time zone | default now()
updated_at      | timestamp without time zone | default now()
rate_adjust_id  | integer                     |
 Indexes:
    "pk_product" PRIMARY KEY, btree (id)
  Foreign-key constraints:
    "fk_rate_adjust" FOREIGN KEY (rate_adjust_id) REFERENCES rate_adjust(id)

我需要获取rate_adjust表中没有foreign_key的{​​{1}}记录,或者他们的日期应该在factor_calendarfrom_day } 范围 我正在尝试使用以下查询,但也返回不在范围内的thru_day记录

rate_adjust

SELECT * FROM rate_adjust AS rad LEFT JOIN factor_calendar as fc ON ( rad.id = fc.rate_adjust_id WHERE rad.product_id = p_id AND start_day_id < end_day_id AND NOT ( ( fc.from_day > start_day_id AND fc.from_day > end_day_id) OR ( fc.thru_day < start_day_id AND fc.thru_day < end_day_id) ) 中存储的数据是

factor_calendar

id | from_day | thru_day | rate_adjust_id —--+----------+----------+---------------- 1 | 14 | 17 | 1 2 | 1 | 3 | 2 3 | 1 | 7 | 3 中存储的数据是

rate_adjust

对于 id | name | type | amount | product_id —--+------------------------+------+------+------------— 1 | rateadjust 1 | 0 | 15 | 3 2 | rateadjust 2 | 0 | 15 | 3 3 | rateadjust 3 | 1 | 15 | 3 4 | rateadjust 4 | 1 | 22 | 3 以及queryp_id = 3以及start_day_id = 4的上述end_day_id = 15,我希望以下的rate_adjust与 我会返回id(s) 12以及4 但是,id 3的评价也会被退回

问题 如何修改我的查询以返回预期的结果请考虑我也欢迎任何以plpgsql语言处理此问题的建议

1 个答案:

答案 0 :(得分:0)

我相信你想要pkill -e -9 "$pattern" | sed -re 's/^(\S+).*/Killed: \1/' - 基于你的解释,而不是样本数据。

以下查询获取4-15期间内有一天的not exists条记录:

rate_adjust

覆盖整个时期只是对逻辑的一点修改。

此外,这不包括select ra.* from rate_adjust ra where not exists (select 1 from factor_calendar fc where fc.rate_adjust_id = ra.id and fc.from_date <= 15 and fc.to_date >= 4 ); 。您的解释没有提及产品,根据提供的数据,它似乎是多余的。但是,平等条件是微不足道的。