sql join中能否使用case when_SQL---多表查询
时间: 2024-02-25 19:54:00 浏览: 45
是的,可以在 SQL JOIN 中使用 CASE WHEN 语句进行多表查询。在多表查询中,CASE WHEN 语句可以用于根据特定条件选择不同的连接类型,例如 INNER JOIN、LEFT JOIN 或 RIGHT JOIN。以下是一个示例查询:
```
SELECT *
FROM table1
CASE WHEN condition1 THEN INNER JOIN table2 ON table1.key = table2.key
WHEN condition2 THEN LEFT JOIN table3 ON table1.key = table3.key
ELSE RIGHT JOIN table4 ON table1.key = table4.key
END
```
在上面的查询中,根据条件 condition1、condition2,可以选择 INNER JOIN、LEFT JOIN 或 RIGHT JOIN 连接类型,并将多个表连接到 table1 上。
相关问题
SQL优化 SELECT id AS origin_planid ,unnest(cabinet_rule_id) cabinet_rule_id -- 判断 next_plan_id 本身是空和 next_plan_id 为 {} ,unnest(case when (next_plan_id is null or next_plan_id[1] is null) then ARRAY[-1]::integer[] else next_plan_id end) as sale_planid --销地计划 , case when dp.plan_receiver_id is null then -1 else dp.plan_receiver_id end orig_plan_rid_r --产地计划 FROM ods.ods_durian_delivery_plan as dp left join ods.ods_hl_commodity_category as hcc on hcc.category_id = dp.category_id WHERE dp.type = 'ORIGIN' AND dp.deleted = 99 AND dp.tenant_id = 1 and dp.cabinet_rule_id='{8}'or dp.cabinet_rule_id='{9}'or dp.cabinet_rule_id='{10000005}'---取白心火龙果 AND hcc.category_name = '火龙果'
这个SQL查询语句中存在一些可以优化的地方。首先,可以将多个OR条件的判断转化为IN条件的判断,例如将:
```
and dp.cabinet_rule_id='{8}'or dp.cabinet_rule_id='{9}'or dp.cabinet_rule_id='{10000005}'
```
转化为:
```
and dp.cabinet_rule_id in ('{8}', '{9}', '{10000005}')
```
这样可以使SQL查询更加简洁、易读,并且可能会提高查询性能。
其次,需要考虑对表中的字段添加索引来加速查询。如可以为`ods_durian_delivery_plan`表中的`type`、`deleted`、`tenant_id`、`category_id`、`cabinet_rule_id`字段添加索引,以加速查询效率。
解读--P0 select date(repay_date) repay_dt, count(1) cnt, sum(case when repay_status=2 then 1 end) repay_cnt, sum(plan_principal+plan_interest+plan_period_service+plan_financing_consulting_fee+coalesce(plan_other_fee,0)) plan_amt, sum(actual_principal+actual_interest+actual_period_service+actual_financing_consulting_fee+coalesce(actual_other_fee,0))actual_amount from (select agg.etl_date,agg.contr_num,agg.reloan_user,i.irr_flag from dm_fk.agg_speed_withhold_aggregation agg ---资产表 left join (select contr_num,irr_flag from dm_fk.agg_speed_withhold_irrflag --费率表 where etl_date='2023-01-31' ) i on agg.contr_num=i.contr_num where agg.etl_date in( '2022-12-31' )--上月底未结清C账户 and cast(overdue_pird_num as int)=0 and clear_flag='0' and agg.platform_nm not in('保理分期','恒易融')) t left join dm_fk.o_assets_xd_new_repay_plan_s p --还款计划表 on t.contr_num =p.contract_number where p.etl_date>=date('2023-01-01') and date(date_trunc('month',repay_date))=date_add('day',1,date(t.etl_date))--账单日为1月 --and date_diff('day',date(repay_date),p.etl_date) >=-6 and date_diff('day',date(repay_date),p.etl_date)=0 --账单日当天分区 根据还款计算获取实还金额 group by 1
这是一段 SQL 查询语句,主要用于从不同的数据表中获取特定的数据并进行统计分析。具体来说,该查询语句的目的是获取某个月份的贷款还款数据。查询语句中使用了多个关键字和函数,下面对其进行逐一解释:
1. select:表示要查询的字段。
2. count:表示统计某个字段的数量。
3. sum:表示求和某个字段的值。
4. case when ... then ... end:表示条件语句,根据条件返回不同的值。
5. left join:表示左连接操作,将两个表按照某个字段进行连接。
6. where:表示筛选条件。
7. group by:表示按照某个字段进行分组。
具体地,该查询语句从两个表中获取数据,分别是资产表和还款计划表。其中,资产表中包含了贷款的基本信息,还款计划表中包含了每个贷款的详细还款计划。查询语句中的条件语句可以筛选出符合要求的贷款,并统计相关的还款数据。最后,使用 group by 对结果进行分组,得到最终的统计数据。
阅读全文