Oracle 11g - объединяет данные из нескольких строк с таблицей отношений m к n - PullRequest
1 голос
/ 14 февраля 2012

У меня может быть простая проблема, но я все еще не могу понять, как заставить все работать.

У меня есть три таблицы с этими важными полями:

  1. Правило - RuleOID
  2. RuleToModificationReason - RuleOID, MdfnReasonOID
  3. МодификацияReason - MdfnReasonOID, MdfnTyp (СОЗДАНИЕ или УДАЛЕНИЕ), MdfnDetail

и т. Д. У меня есть эти данные:

  1. Правило - RuleOID = 1
  2. RuleToModificationReason
    • RuleOID = 1, MdfnReasonOID = 1
    • RuleOID = 1, MdfnReasonOID = 2
  3. ModificationReason
    • MdfnReasonOID = 1, MdfnTyp = 'СОЗДАНИЕ', MdfnDetail = 'Сведения о создании'
    • MdfnReasonOID = 2, MdfnTyp = 'DELETION', MdfnDetail = 'Сведения об удалении'

Я хочу иметь вывод в одну строку для создания и удаления с правилом oid.

f.e. : RuleOID, подробности создания, подробности удаления.

Я могу загрузить его в два ряда, например:

  1. RuleOID, деталь создания, NULL
  2. RuleOID, NULL, подробности удаления.

Причина создания и удаления может быть нулевой.

Это вообще возможно?

Ответы [ 3 ]

0 голосов
/ 14 февраля 2012

Будет ли у вас работать?

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 голосов
/ 14 февраля 2012
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 голосов
/ 14 февраля 2012

Если вы уверены, что всегда будет самое большее одна деталь создания для данного правила, а самое большее одна деталь удаления для данного правила, тогда выможно использовать подзапросы:

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 s, но это намного сложнее.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...