微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

带有一些连接的分层查询

如何解决带有一些连接的分层查询

我正在努力编写一个执行查询,该查询将包含一个子选择中的数据,并根据第一个子选择中的行从另一个表中分层检索数据。

所以,我从带有连接的多个表中检索了一些数据,最终归结为以下内容

CREATE TABLE TBL1 (UUID,MiscData,KeyToLookup,ConditionClause ) AS
SELECT  13,'ATM',12345,null                  FROM DUAL UNION ALL
SELECT 447,'Balance Inquiry',67890,'BALANCE_INQUIRY_FEE' FROM DUAL UNION ALL
SELECT 789,'Credit',22321,'CREDIT_FEE'          FROM DUAL;

现在,我有一个表来存储费用的层次结构:

CREATE TABLE TBL2 ( TariffDomainID,FeeType,UpperTariffDomainID,ID ) AS
SELECT 1543,'WHATEVER_FEE',154,1 FROM DUAL UNION ALL 
SELECT 1543,'BALANCE_INQUIRY_FEE',2 FROM DUAL UNION ALL
SELECT  154,'SMTHELSE_FEE',15,3 FROM DUAL UNION ALL
SELECT  154,'CREDIT_FEE',4 FROM DUAL UNION ALL
SELECT   15,null,5 FROM DUAL;

并且有一种方法可以将第一个选择链接到第二个表的层次结构中的最低行,连接很少,但最终是这样的:

CREATE TABLE TBL3 ( ID,FirstTblKey,SecondTblKey ) AS
SELECT 1,1543 FROM DUAL UNION ALL
SELECT 2,1543 FROM DUAL;

重要的一点是,不能保证按照 KeyToLookup 的指示,在第二个表中会直接有带有此 TBL3 的行。 例如。在上面的例子中:

TBL1.UUID=789通过TBL3链接TBL2行,TariffDomainID=1543
TBL2 中没有包含 TariffDomainID=1543FeeType=CREDIT_FEE 的行;

然而,TBL2 包含指向同一个表但上层的链接UpperTariffDomainID=154,
并且在 TBL2一行,其中包含 TariffDomainID=154FeeType=CREDIT_FEE

最后,我需要将 TBL1 中的信息与 TBL2 中此键的所有出现按层次结构连接起来,按层次结构的深度编号。

所以我希望得到这个:

| UUID |     MiscData    | KeyToLookup |   ConditionClause   | TariffDomainIDWithPresence | Depth |
|------|-----------------|-------------|---------------------|----------------------------|-------|
| 13   | ATM             |    12345    | null                |            null            |  null |
| 447  | Balance Inquiry |    67890    | BALANCE_INQUIRY_FEE |            1543            |   1   |
| 447  | Balance Inquiry |    67890    | BALANCE_INQUIRY_FEE |            15              |   3   |
| 789  | Credit          |    22321    | CREDIT_FEE          |            154             |   2   |

谁能教我如何进行这样的分层查询

解决方法

您可以使用连接到其他两个表的分层查询:

SELECT DISTINCT
       t1.uuid,t1.miscdata,t1.keytolookup,t1.conditionclause,t2.tariffdomainid,t2.depth
FROM   tbl1 t1
       LEFT OUTER JOIN tbl3 t3
       ON ( t1.keytolookup = t3.firsttblkey )
       OUTER APPLY (
         SELECT tariffdomainid,LEVEL AS depth
         FROM   tbl2 t2
         WHERE  t2.tariffdomainid = t3.secondtblkey
         START WITH
                t2.feetype = t1.conditionclause
         CONNECT BY
                PRIOR TariffDomainID = UpperTariffDomainID
       ) t2
ORDER BY
       uuid,depth

对于样本数据,输出:

UUID | MISCDATA        | KEYTOLOOKUP | CONDITIONCLAUSE     | TARIFFDOMAINID | DEPTH
---: | :-------------- | ----------: | :------------------ | -------------: | ----:
  13 | ATM             |       12345 | null                |           null |  null
 447 | Balance Inquiry |       67890 | BALANCE_INQUIRY_FEE |           1543 |     1
 447 | Balance Inquiry |       67890 | BALANCE_INQUIRY_FEE |           1543 |     3
 789 | Credit          |       22321 | CREDIT_FEE          |           1543 |     2

(注意:您需要 DISTINCT,因为 TBL2 中有多个 1543 和 154 条目,因此分层查询可以采用多条路径从开始到结束条件。如果您的实际数据没有这些重复项,那么您应该可以删除 DISTINCT 子句。)

dbfiddle here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?