[英]SQL Left join same table but with condition possible?
我有一个主表
|-------------|------------|
| Procedure | Modifier |
|:------------|:-----------|
| AA | 00 |
| AA | 21 |
| AA | 26 |
|-------------|------------|
和费率表
|-------------|------------|-------|
| Procedure | Modifier | Rate |
|:------------|:-----------|-------|
| AA | 00 | $10 |
| AA | 21 | $20 |
| AA | QA | $30 |
|-------------|------------|-------|
我希望将费率表左连接到主表 ON 过程 AND 修饰符,以找到费率。
但是,如果没有匹配的过程 AND 修饰符,那么我想通过过程和修饰符 00 加入以获得 10 美元的费率。
最终结果看起来像这样,|
-------------|------------|------|
| Procedure | Modifier | Rate |
|:------------|:-----------|------|
| AA | 00 |$10 |
| AA | 21 |$20 |
| AA | 26 |$10 |
|-------------|------------|------|
不是
|-------------|------------|------|
| Procedure | Modifier | Rate |
|:------------|:-----------|------|
| AA | 00 |$10 |
| AA | 21 |$20 |
| AA | 26 |null |
|-------------|------------|------|
我想“更糟糕”的情况是分开做这件事并分成两个陈述。 我的第一个左连接将通过 proc 和修饰符然后在我的第二个语句中仅通过过程? 有没有办法在一个语句中做到这一点?
您可以使用两个左连接来简单而简单地完成此操作。
请注意,这与 Kazi 的答案非常相似,只是语法更简单
select
m.[Procedure],
m.Modifier,
isnull(r.rate, r2.rate) rate
from maintable m
left join rates r on m.[Procedure] = r.[Procedure] and m.Modifier = r.Modifier
left join rates r2 on m.[Procedure] = r2.[Procedure]
and r2.Modifier = '00'
and r.rate is null
模式和插入语句:
create table maintable ([Procedure] varchar(10), Modifier varchar(10));
insert into maintable values( 'AA' , '00');
insert into maintable values( 'AA' , '21');
insert into maintable values( 'AA', '26');
create table rates ( [Procedure] varchar(10), Modifier varchar(10), Rate varchar(10));
insert into rates values( 'AA' , '00', '$10');
insert into rates values( 'AA' , '21' , '$20');
insert into rates values( 'AA' , 'QA' , '$30');
查询#1(带有子查询):
select m.[Procedure] , m.Modifier ,(case when r.rate is null then (select rate from rates where rates.[procedure]=m.[procedure] and rates.modifier='00') else r.rate end)rate
from maintable m
left join rates r on m.[Procedure] =r.[Procedure] and m.Modifier =r.Modifier
Output:
程序 | 修饰符 | 速度 |
---|---|---|
AA | 00 | 10 美元 |
AA | 21 | 20 美元 |
AA | 26 | 10 美元 |
查询#2(外部应用):
select m.[Procedure] , m.Modifier ,(case when r.rate is null then t.rate else r.rate end)rate
from maintable m
left join rates r on m.[Procedure] =r.[Procedure] and m.Modifier =r.Modifier
outer apply(select rate from rates where rates.[Procedure]=m.[Procedure] and rates.modifier='00')t
Output:
程序 | 修饰符 | 速度 |
---|---|---|
AA | 00 | 10 美元 |
AA | 21 | 20 美元 |
AA | 26 | 10 美元 |
db<> 在这里摆弄
您可以使用 CASE 语句。 下面的示例在主表匹配过程和修饰符上从费率表进行左连接。 case 语句将 null 值替换为 10 或使用速率(如果存在)。
select
m.procedure,
m.modifier,
case when r.rate is null then 10 else r.rate end as rate
from main_table m
left join rates_table r on (m.procedure = r.procedure and m.modifier = r.modifier)
对此的一个变体是在 select 子句中使用 apply 运算符而不是相关子查询,并且也可以使用 coalesce 来代替 case 表达式,如果左侧没有匹配率,则可以使用 10加入或外部应用:
select
m.[procedure]
, m.modifier
, coalesce(r.rate, oa.rate, 10) as rate
from maintable m
left join rates r on m.[procedure] = r.[procedure] and m.modifier = r.modifier
outer apply (
select rate
from rates
where rates.[procedure]=m.[procedure] and rates.modifier='00'
) oa
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.