【问题标题】:Multiple case merge sql多案例合并sql
【发布时间】:2014-02-28 16:12:15
【问题描述】:

我有两个数据集 ab,每个数据集都有 cusip 和 ticker 字段。我想执行的 sql 将从集合 b if a.cusip=b.cusip 中获取 a 列,但如果我找不到匹配的 cusip,我想从bif a.ticker=b.ticker.

有没有简单的方法来执行这个?我无法一次性构建代码。

【问题讨论】:

  • 到目前为止你有什么?
  • 以下是否回答了您的问题@Ryan Lewis
  • 很抱歉让大家挂了。似乎所有的解决方案都是有效的,但我认为 NullSoul 是最优雅的。不过,我可以想到案例一的其他用途!
  • @Ryan Lewis 很高兴它对你有用。

标签: sql merge sas


【解决方案1】:

你可以试试这样的:

data dataset_a;
input cusip ticker;
datalines;
1 111
2 222
3 333
5 555
;
run;
data dataset_b;
input cusip ticker value;
datalines;
1 111 10
20 222 25
30 333 40
4 444 55
;
run;

proc sql _method;
create table mydata as 
select 
a.*
,b.value
from dataset_a as a
left join dataset_b as b
on (case     
        when a.cusip=b.cusip then 1
        when a.ticker=b.ticker then 1
        else 0
    end)=1
;
quit;

返回:

cusip    ticker    value
1   111   10
2   222   25
3   333   40
5   555    .

【讨论】:

    【解决方案2】:

    Inner join 和 Or 在你的 where 子句条件中应该做的工作。

    Select *     from a 
    inner join   b on a.cusip=b.cusip 
    or           a.ticket = b.ticket;
    

    【讨论】:

    • “Inner Join”将(仅)从两个表中检索匹配数据,“OR”将满足您在匹配 cusip OR 票证上的条件。
    • 对此解决方案的快速评论:虽然它在代码方面有效且优雅,但在大型数据集(12gb)上似乎需要一段时间。我尚未将其与其他选项进行比较但由于某种原因,它比单独执行每个ticker和cusip查询,然后加入和排除重复项要慢一些。
    • 是的 OR 语句对于数据库来说非常难以优化,因此它们通常性能很差。如果效率比可读性更重要,那么最好的办法可能是避免它们。
    • @Ryan Lewis 我不知道你的桌子有多大。是的,正如 Rob 提到的,“OR”的操作成本非常昂贵。
    【解决方案3】:

    您需要加入 B 桌两次,一次在 cusip 上,一次在股票行情上。然后就可以用coalesce取第一个非空值了。

    select
    coalesce (b_cusip.column, b_ticker.column),
    ...
    
        from
        a
        left outer join b b_cusip
          on a.cusip = b_cusip.cusip
        left outer join b b_ticker
          on a.ticker = b_ticker.ticker
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-26
      • 2015-02-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多