oracle 如果一个表的所有子表行都与搜索条件匹配,则从该表中获取行?

aelbi1ox  于 2023-04-20  发布在  Oracle
关注(0)|答案(2)|浏览(378)

假设我有表1和表2。
表1的列为(pkcol,Seq)。表2(pkcol,fkcol_from_Table1,details)
例如:

表1

pkcolseq
10个1
二十
三十
我的天
我的天

表2

pkcolfkcol_from_Table1详细信息
一百10个R1
一百零一10个R2
一百零三二十R1
一百零四三十R4
一百零五三十R2

假设我的搜索条件是R1和R2,那么我想通过连接表2从表1中获得详细信息。从上面的例子中,使用搜索条件从表2中只获得100和101(pkcol),并使用外键连接从表1中获得“1”。
我可以使用oracle sql中的查询来实现这一点吗?

mfpqipee

mfpqipee1#

select t2.*, t1.seq
from table2 t2 left join table1 t1 on t2.pkcol=t1.pkcol

我知道上面是你希望连接表的方式,考虑到你必须拥有table2中的所有内容。对于那个查询,你可以在where子句中添加你需要的过滤条件。但是,我不清楚这些表要表示什么。你应该为两个表提供DDL,也包括PK和FK。它是一个多对多的关系吗?哪个表的主键被另一个引用,这将有几行引用相同的PK?一个一对零或一个关系似乎不像我好的数据库设计。如果没有一对多的关系,我宁愿只有一个表。

9o685dep

9o685dep2#

如果我理解正确的话,您希望包含'R1'和'R2'的行用于引用表1PK_COL的同一FK_COL。

WITH        --  Sample data
    tbl_1 (PK_COL, SEQ) AS
        (   Select 10, 1 From Dual Union All
            Select 20, 2 From Dual Union All
            Select 30, 7 From Dual          
            
        ),
    tbl_2 (PK_COL, FK_COL, DETAILS) AS
        (   Select 100, 10, 'R1' From Dual Union All
            Select 101, 10, 'R2' From Dual Union All
            Select 103, 20, 'R1' From Dual Union All
            Select 104, 30, 'R4' From Dual Union All
            Select 105, 30, 'R2' From Dual 
        )
--
--   Main SQL    
Select  PK_COL, FK_COL, DETAILS, SEQ
From    ( Select    t2.PK_COL, t2.FK_COL, t2.DETAILS, t1.SEQ,
                  LISTAGG(DISTINCT t2.DETAILS, ', ') WITHIN GROUP (Order By t2.DETAILS) Over(Partition By t1.PK_COL) "LIST_DETAILS"
          From  tbl_1 t1
          Inner Join tbl_2 t2 ON(t2.FK_COL = t1.PK_COL)
        )
Where LIST_DETAILS = 'R1, R2'
--
-- R e s u l t :
    PK_COL     FK_COL DETAILS        SEQ
---------- ---------- ------- ----------
       100         10 R1               1
       101         10 R2               1

相关问题