【问题标题】:Oracle:Select Most Recent based on many-many relationOracle:基于多对多关系选择最近
【发布时间】:2021-02-07 09:46:03
【问题描述】:

我有以下两个表 card_accountsaccount_transaction

create table card_accounts(card_number number(16),account_number number(10),status char(1));


Insert into card_accounts(card_number,account_number,status)values(123456,000001,'A');
Insert into card_accounts(card_number,account_number,status)values(123456,000002,'A');
Insert into card_accounts(card_number,account_number,status)values(223456,000003,'A');
Insert into card_accounts(card_number,account_number,status)values(223456,000004,'A');
Insert into card_accounts(card_number,account_number,status)values(33456,000004,'A');
Insert into card_accounts(card_number,account_number,status)values(523456,000007,'A');

create table account_transaction(account_number number(16),transactionId number(10),created_date DATE);


Insert into account_transaction(account_number,transactionId,created_date)values(000001,543678,TO_DATE('2003/05/03 21:02:44', 'yyyy/mm/dd hh24:mi:ss'));
Insert into account_transaction(account_number,transactionId,created_date)values(000002,543679,TO_DATE('2003/05/03 21:02:34', 'yyyy/mm/dd hh24:mi:ss'));
Insert into account_transaction(account_number,transactionId,created_date)values(000003,543680,TO_DATE('2003/05/03 18:02:44', 'yyyy/mm/dd hh24:mi:ss'));
Insert into account_transaction(account_number,transactionId,created_date)values(000004,543681,TO_DATE('2003/05/03 17:02:44', 'yyyy/mm/dd hh24:mi:ss'));
Insert into account_transaction(account_number,transactionId,created_date)values(000007,543682,TO_DATE('2003/05/03 21:02:44', 'yyyy/mm/dd hh24:mi:ss'));

我想根据以下条件检索最近交易的帐号。当我使用 card_number 作为 key 时,检查 card_number 是否与两个 account_number 相关联,如果是,请转到 account_transaction 并返回有最近 created_date 的一方。如果 card_number 有两个以上的帐户或少于两个帐户,则不要执行任何操作。

输入:

我通过 card_number= 123456 时的预期输出

当我传递其他 card_numbers 时,不会检索任何内容,因为它不符合条件

【问题讨论】:

    标签: sql oracle oracle11g oracle10g


    【解决方案1】:

    嗯。 . .

    select ca.*
    from (select ca.card_number, act.*,  -- or whatever columns you want
                 row_number() over (partition by ca.card_number order by act.created_date desc) as seqnum
          from (select ca.*, count(*) over (partition by ca.card_number) as cnt
                from card_accounts ca
               ) ca join
               account_transaction act
               on act.account_number = ca.account_number
          where ca.cnt = 2
         ) ca
    where seqnum = 1;
    

    最里面的子查询计算每个数字的帐户数,where ca.cnt = 2 过滤为正好两个。中间子查询获取给定数字的最新交易。

    注意:如果要过滤特定数字,可以在最里面的子查询中进行。

    Here 是一个 dbfiddle。

    【讨论】:

    • 我将 card_number 传递给最里面的查询,但得到 ORA-00918: column ambiguously defined 但得到 ORA-00918: column ambiguously defined
    • @Rocky4Ever 。 . .这只是子查询中的*s。我添加了一个显示此工作的 dbfiddle。
    • @GordonLinoff .....在这里,当我发送 card_number= 223456 时什么都不返回,因为 223456 与 00003 和 00004 相关联,而 00004 又与另一个 card_number 相关联。但是上面的查询甚至返回结果223456
    猜你喜欢
    • 1970-01-01
    • 2020-11-22
    • 2017-09-26
    • 2017-09-18
    • 1970-01-01
    • 2018-09-27
    • 1970-01-01
    • 2014-07-22
    • 1970-01-01
    相关资源
    最近更新 更多