如何解决带有一些连接的分层查询
我正在努力编写一个执行查询,该查询将包含一个子选择中的数据,并根据第一个子选择中的行从另一个表中分层检索数据。
所以,我从带有连接的多个表中检索了一些数据,最终归结为以下内容:
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=1543
和 FeeType=CREDIT_FEE
的行;
然而,TBL2
包含指向同一个表但上层的链接,UpperTariffDomainID=154
,
并且在 TBL2
中有一行,其中包含 TariffDomainID=154
和 FeeType=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 举报,一经查实,本站将立刻删除。