在条件下加入创建的表

问题描述 投票:0回答:3

我正在创建一个代码,以在特定条件下连接两个不同的表。表格看起来像这样

(TABLE 2)
date | deal_code | originator   | servicer | random |
-----------------------------------------------------
2011 |    001    | commerzbank  |   SPV1   |  1     |
2012 |    001    | commerzbank  |   SPV1   |  12    |
2013 |    001    | commerzbank  |   SPV1   |  7     |
2013 |    005    | unicredit    |   SPV2   |  7     |

和另一张桌子

(TABLE 1)
date | deal_code | amount |
---------------------------
2011 |    001    | 100    |
2012 |    001    | 100    |
2013 |    001    | 100    |
2013 |    005    | 200    |

我希望将此作为最终结果

date | deal_code | amount | originator   | servicer | random |
--------------------------------------------------------------
2013 |    001    | 100    | commerzbank  |   SPV1   |  7     |
2013 |    005    | 200    | unicredit    |   SPV2   |  7     |

我创建了以下代码

select q1.deal_code, q1.date
from table1 q1  
where q1.date = (SELECT MAX(t4.date)
             FROM table1 t4 
             WHERE t4.deal_code = q1.deal_code)

这给了我:

(TABLE 3)
date | deal_code | amount |
---------------------------
2013 |    001    | 100    |
2013 |    005    | 200    |

这是表1的最新观察,现在我想给出发送者和服务商信息给出deal_code和date。有什么建议吗?我希望已经足够清楚了。谢谢。

sql-server ssms
3个回答
0
投票

这应该做你想要的。在命名列时请小心。日期是一个保​​留字,太模糊,不能成为列的好名称。

declare @Something table
(
    SomeDate int
    , deal_code char(3)
    , originator varchar(20)
    , servicer char(4)
    , random int
)

insert @Something values
(2011, '001', 'commerzbank', 'SPV1', 1)
, (2012, '001', 'commerzbank', 'SPV1', 12)
, (2013, '001', 'commerzbank', 'SPV1', 7)
, (2013, '005', 'unicredit  ', 'SPV2', 7)

declare @SomethingElse table
(
    SomeDate int
    , deal_code char(3)
    , amount int
)

insert @SomethingElse values
(2011, '001', '100')
, (2012, '001', '100')
, (2013, '001', '100')
, (2013, '005', '200')

select x.SomeDate
    , x.deal_code
    , x.originator
    , x.servicer
    , x.random
    , x.amount
from
(
    select s.SomeDate
        , s.deal_code
        , s.originator
        , s.servicer
        , s.random
        , se.amount
        , RowNum = ROW_NUMBER()over(partition by s.deal_code order by s.SomeDate desc)
    from @Something s
    join @SomethingElse se on se.SomeDate = s.SomeDate and se.deal_code = s.deal_code
) x
where x.RowNum = 1

0
投票

看起来这样可行:

DECLARE @MaxYear INT;

SELECT @MaxYear = MAX(date)
FROM table1 AS t1
    INNER JOIN table2 AS t2
        ON t1.deal_code = t2.deal_code;

SELECT t1.date,
       t1.deal_code,
       t1.amount,
       t2.originator,
       t2.servicer,
       t2.random
FROM table1 AS t1
    INNER JOIN table2 AS t2
        ON t1.date = @MaxYear
           AND t1.deal_code = t2.deal_code;

0
投票

我同意Sean Lange关于date专栏名称的看法。他的方法绕过了相关子查询的依赖关系,但事实上,你只需要在现有查询中添加一个INNER JOIN,以便将amount列添加到结果集中。

select 
  q2.date,
  q2.deal_code, 
  q1.amount,
  q2.originator,    
  q2.servicer,  
  q2.random
from 
  table1 q1  
  join
  table2 q2
    on q1.date = q2.date
    and q1.deal_code = q2.deal_code
where q1.date = (SELECT MAX(t4.date)
             FROM table1 t4 
             WHERE t4.deal_code = q1.deal_code)
© www.soinside.com 2019 - 2024. All rights reserved.