首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle11g-使用m到n关系表连接多行的数据

Oracle11g-使用m到n关系表连接多行的数据
EN

Stack Overflow用户
提问于 2012-02-14 15:58:34
回答 3查看 712关注 0票数 1

我可能有一个简单的问题,但我仍然不知道如何使事情运作。

我有三个表,其中有以下几个重要的字段:

  1. Rule - RuleOID
  2. RuleToModificationReason - RuleOID,MdfnReasonOID
  3. ModificationReason - MdfnReasonOID,MdfnTyp (创建或删除),MdfnDetail

还有f.e。我有这样的数据:

  1. Rule - RuleOID = 1
  2. RuleToModificationReason
    • RuleOID = 1,MdfnReasonOID = 1
    • RuleOID = 1,MdfnReasonOID = 2

  1. ModificationReason
    • MdfnReasonOID = 1,MdfnTyp = 'CREATION',MdfnDetail = 'Creation detail'
    • MdfnReasonOID = 2,MdfnTyp =‘MdfnDetail’,MdfnDetail= 'Deletion detail'

我希望在一行上有输出,以便用规则样条创建和删除。

f.e.::RuleOID,创建细节,删除细节。

我可以将它加载到两行如下:

NULL

  • RuleOID,

  • RuleOID,创建详细信息, NULL,删除细节。

创建和删除原因可以为空。

有可能吗?

EN

回答 3

Stack Overflow用户

发布于 2012-02-14 16:36:15

如果您确信始终最多有一个创建--给定规则的详细信息,而给定规则最多只有一个删除详细信息--那么您可以使用子查询:

代码语言:javascript
复制
SELECT Rule.RuleOID,
       ( SELECT MdfnDetail
           FROM ModificationReason
          WHERE MdfnType = 'CREATION'
            AND MdfnReasonOID IN
                 ( SELECT MdfnReasonOID
                     FROM RuleToModificationReason
                    WHERE RuleOID = Rule.RuleOID
                 )
       ) AS CreationReason,
       ( SELECT MdfnDetail
           FROM ModificationReason
          WHERE MdfnType = 'DELETION'
            AND MdfnReasonOID IN
                 ( SELECT MdfnReasonOID
                     FROM RuleToModificationReason
                    WHERE RuleOID = Rule.RuleOID
                 )
       ) AS DeletionReason
  FROM Rule
;

(仅用JOIN也可以实现这一点,但这要困难得多。)

票数 0
EN

Stack Overflow用户

发布于 2012-02-14 16:37:26

这对你有用吗?

代码语言:javascript
复制
SELECT a.RuleOID, 
CASE
  WHEN b.MdfnTyp = 'CREATION' THEN b.MdfnDetail
  ELSE NULL -- can omit, case has default "else null"
END AS creation_detail,
CASE
  WHEN b.MdfnTyp = 'DELETION' THEN b.MdfnDetail
  ELSE NULL -- can omit, case has default "else null"
END AS deletion_detail

RuleToModificationReason a
INNER JOIN ModificationReason b ON (a.MdfnReasonOID = b.MdfnReasonOID)

注意:按目的跳过的规则表(假设引用完整性由约束强制执行),因为您不使用该表中的任何字段

票数 0
EN

Stack Overflow用户

发布于 2012-02-14 16:38:35

代码语言:javascript
复制
select crtr.RuleOID RuleOID, crt.MdfnDetail Creation_detail, dlt.MdfnDetail Deletion_detail
from ModificationReason crt, ModificationReason dlt, RuleToModificationReason crtr, RuleToModificationReason dltr
where crt.MdfnTyp = 'CREATION' and dlt.MdfnTyp = 'DELETION'
and crt.MdfnReasonOID = crtr.MdfnReasonOID
and dlt.MdfnReasonOID = dltr.MdfnReasonOID
and crtr.RuleOID = dltr.RuleOID   

(无法检查)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9280021

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档