【问题标题】:Is there a way to do an If Then statement in the join clause有没有办法在连接子句中执行 If Then 语句
【发布时间】:2021-01-31 10:09:57
【问题描述】:

我有两张表,即消费和预订,我正在尝试对其进行完全联接。由于表格的性质(并非所有预订都有花费,也不是所有花费都有 booking_id,有时会分配错误的 booking_id),我想在 join 子句中做一个条件语句。

select bk.booking_id, bk.company_id, bk.event_id, bk.total_amount_booked, sp.spend
from 
(select booking_id, company_id, event_id, booked_rate, total_amount_booked
from bookings) bk
full join
(select booking_id, company_id, event_id, normalized_spend, spend
from spend) sp
on (bk.booking_id = sp.booking_id and bk.booked_rate = sp.normalized_spend)
or (bk.company_id = sp.company_id and bk.event_id = sp.event_id);

基本上,如果 booking_id 匹配且标准化支出与 booking_rate 匹配,则在该条件下加入。 如果没有,请加入 company_id 和 event_id。

但是,执行此查询会返回

FULL JOIN is only supported with merge-joinable join conditions;

有没有更好的方法来做到这一点? 使用红移

【问题讨论】:

  • 旁白 - RedShift 不在 PostgreSQL 上运行。它是一种独特的 DBMS,起源于早期的 Postgres 方言。
  • DataGrip 说我在 i686-pc-linux-gnu 上运行 PostgreSQL 8.0.2,由 GCC gcc (GCC) 3.4.2 20041017 (Red Hat 3.4.2-6.fc3) 编译,红移 1.0.19097。我假设它是旧版本的 Postgres,但有些功能在 Redshift 上无法执行,而在 PostgreSQL 上可以执行。

标签: sql left-join amazon-redshift where-clause full-outer-join


【解决方案1】:

这有点痛苦,但您可以模拟full 加入两个left joinsunion all

select bk.booking_id, bk.company_id, bk.event_id, bk.total_amount_booked, sp.spend
from bookings bk
left join spend sp
    on (bk.booking_id = sp.booking_id and bk.booked_rate = sp.normalized_spend)
    or (bk.company_id = sp.company_id and bk.event_id = sp.event_id)
union all
select bk.booking_id, bk.company_id, bk.event_id, bk.total_amount_booked, sp.spend
from spend sp
left join bookings bk
    on (bk.booking_id = sp.booking_id and bk.booked_rate = sp.normalized_spend)
    or (bk.company_id = sp.company_id and bk.event_id = sp.event_id)
where bk.booking_id is null

【讨论】:

    【解决方案2】:

    也许使用 CASE 语句,比如

    ...ON CASE WHEN (bk.booking_id = sp.booking_id and bk.booked_rate = sp.normalized_spend)
              THEN (bk.booking_id = sp.booking_id and bk.booked_rate = sp.normalized_spend)
             WHEN (bk.company_id = sp.company_id and bk.event_id = sp.event_id) 
              THEN (bk.company_id = sp.company_id and bk.event_id = sp.event_id)
        END
    

    【讨论】:

    • 这给出了相同的“FULL JOIN 仅支持可合并连接的连接条件”错误
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-01
    相关资源
    最近更新 更多