在基于另一个字段的一个字段条件上加入

时间:2018-08-14 13:14:36

标签: sql oracle join conditional-statements

我在加入时遇到麻烦。由于我正在执行相当大的过程(超过1000行),因此必须进行大量的CTE和联接。但是,这对我来说似乎很简单,但是现在我被卡住了。

我想加入一个表,但只能在

的字段上
  1. 如果b为true(状态!= 1),则不会处于无效状态
  2. 但仅当它们在X_date(Status_time < x_date)之前变成该状态时

这意味着在某些情况下,我想要在state=1所在的行,因为state=1是在x_date之后设置的。

我认为使用保护套会降低性能,使之不再可行。但我愿意接受任何建议。

这是我尝试首先加入的示例(更大,但是我删除了与该问题无关的部分)

 Left join contracts con4 
  on con4.owner_id = cu.cust_id
  and.......some condition
  and.......some condition
  and  (con4.contract_status != 1 and con4.status_time < cr.x_date)   

示例代码

下面的代码尝试与上面的代码相同。我想加入,因为只有其中一个条件成立,而并非两个都成立。 (状态= 1且b.status_time

with sample_t as(
  select '123' cust_id, '' contract_status, sysdate x_date from dual),

  contract as(select '1' contract_status, '123' cust_id, sysdate+1 status_time from dual)

  select * from sample_t a
  left join contract b
  on a.cust_id = b.cust_id
  and (b.contract_status != '1' and b.status_time < x_date)

1 个答案:

答案 0 :(得分:0)

这符合您的要求吗?

and  (con4.contract_status != 1 and con4.status_time < cr.x_date
  or  con4.contract_status = 1 and con4.status_time > cr.x_date)

您尚未说明con4.status_time = cr.x_date时会发生什么。