繁体   English   中英

SQL 左连接同一个表但条件可能?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM