Оператор SQL, объединяющий 3 таблицы Oracle - PullRequest
0 голосов
/ 25 февраля 2012

Я просмотрел несколько сайтов и многочисленные учебные пособия, пытаясь определить наиболее близкое соответствие для моей ситуации, и, хотя я нахожу много похожих возможных решений, ни одно точное решение не дает мне того, что мне нужно. При каждой попытке я либо возвращал неверные данные, дублировал, либо не мог вернуть все нужные поля Любая помощь очень ценится. Спасибо, новичок

У меня есть три таблицы, каждая из которых имеет primary_key для SUBR_ID. Проще говоря, я пытаюсь извлечь BENEFIT_CARRY_OVER из TBL_SUBR_INDV_CARRY_OVER для всех SUBR_ID и sub INDV_ID (один-ко-многим), где GRP_ID = '0G0000000', выбрав имя, фамилию и идентификатор подписчика, индивидуальный идентификатор и перенос выгоды , Ниже приведены три таблицы, на которые ссылаются, и попытки оператора.

TBL_SUBR_INDV_CARRY_OVER:
SUBR_ID
INDV_ID
BENEFIT_CARRY_OVER

TBL_SUBR_GRP:
SUBR_ID
GRP_ID

TBL_SUBR_INDV:
SUBR_ID
INDV_ID
LNME
FNME

Попытка # 1

select DISTINCT DCS2000.TBL_SUBR_GRP.SUBR_ID, DCS2000.TBL_SUBR_INDV.INDV_ID, LNME, FNME, GRP_ID, BENEFIT_YEAR, BENEFIT_CARRY_OVER  
from DCS2000.TBL_SUBR_INDV_CARRY_OVER, 
     DCS2000.TBL_SUBR_GRP, 
     DCS2000.TBL_SUBR_INDV
where DCS2000.TBL_SUBR_INDV_CARRY_OVER.SUBR_ID = DCS2000.TBL_SUBR_INDV.SUBR_ID
     and DCS2000.TBL_SUBR_INDV.SUBR_ID = DCS2000.TBL_SUBR_GRP.SUBR_ID
     and DCS2000.TBL_SUBR_GRP.GRP_ID = '0G0000000'
     and DCS2000.TBL_SUBR_INDV_CARRY_OVER.BENEFIT_CARRY_OVER > '0'

Попытка # 2

select DCS2000.TBL_SUBR_INDV.SUBR_ID, DCS2000.TBL_SUBR_INDV.INDV_ID, DCS2000.TBL_SUBR_INDV.LNME, DCS2000.TBL_SUBR_INDV.FNME, DCS2000.TBL_SUBR_GRP.GRP_ID, DCS2000.TBL_SUBR_INDV_CARRY_OVER.BENEFIT_YEAR, DCS2000.TBL_SUBR_INDV_CARRY_OVER.BENEFIT_CARRY_OVER  
from DCS2000.TBL_SUBR_INDV
join DCS2000.TBL_SUBR_GRP on ( 
     where DCS2000.TBL_SUBR_INDV_CARRY_OVER.SUBR_ID = DCS2000.TBL_SUBR_INDV.SUBR_ID
     and DCS2000.TBL_SUBR_INDV.SUBR_ID = DCS2000.TBL_SUBR_GRP.SUBR_ID
     and DCS2000.TBL_SUBR_GRP.GRP_ID = '0G0000000'
     and DCS2000.TBL_SUBR_INDV_CARRY_OVER.BENEFIT_CARRY_OVER > '0'

Попытка # 3

 SELECT LNME, FNME, SUBR_ID, INDV_ID
 FROM DCS2000.TBL_SUBR_INDV
 WHERE DCS2000.TBL_SUBR_INDV.SUBR_ID IN
        (SELECT BENEFIT_CARRY_OVER
        FROM DCS2000.TBL_SUBR_INDV_CARRY_OVER
        WHERE DCS2000.TBL_SUBR_INDV_CARRY_OVER.SUBR_ID IN
            (SELECT SUBR_ID
            FROM DCS2000.TBL_SUBR_GRP
            WHERE DCS2000.TBL_SUBR_GRP.GRP_ID = '0G0000000')
    )  

Ответы [ 2 ]

1 голос
/ 25 февраля 2012

Я предполагаю, что дубликаты происходят, потому что у одного человека может быть много записей переноса. Поэтому попробуйте:

select i.SUBR_ID, 
       i.INDV_ID, 
       max(i.LNME) LNME, 
       max(i.FNME) FNME, 
       max(g.GRP_ID) GRP_ID, 
       o.BENEFIT_YEAR, 
       sum(o.BENEFIT_CARRY_OVER) BENEFIT_CARRY_OVER
from DCS2000.TBL_SUBR_GRP g
join DCS2000.TBL_SUBR_INDV i
  on g.SUBR_ID = i.SUBR_ID
join DCS2000.TBL_SUBR_INDV_CARRY_OVER o
  on i.SUBR_ID = o.SUBR_ID and i.INDV_ID = o.INDV_ID and o.BENEFIT_CARRY_OVER > 0
where g.GRP_ID = '0G0000000' 
group by i.SUBR_ID, 
         i.INDV_ID, 
         o.BENEFIT_YEAR

Обратите внимание, что отдельная таблица должна быть присоединена к таблице переноса как подписчиком , так и индивидуальным идентификатором; также, что числовые поля (такие как BENEFIT_CARRY_OVER) не должны иметь кавычек вокруг своих значений.

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

Проблема в том, что из-за одного ко многим простое объединение всех трех таблиц даст дублирующую строку для данных, которые вас интересуют. Объединение должно составлять целую строку для каждой строки, объединенной вместе.Принимая во внимание, что вам нужна отдельная строка.

Я часто нахожу, что для построения сложного запроса лучше всего по частям

Итак, сначала найдите все идентификаторы со значением интереса, содин ряд для каждого.Это будет несколько сокращать имена из-за клавиатуры, которую я использую.

Выберите отличный subr_id из subrgrp, где grpid = 0000006

Затем объедините это со следующей таблицей вверх

Выберите отдельный indvid из subrindv, где subrid in (Выберите отличный subr_id из subrgrp, где grpid = 0000006)

Затем выберите последние интересующие строки.

Выберите перенос из subrindv, где indvid в (Выберите отличный indvidиз subrindv, где subrid in (Выберите отличный subr_id из subrgrp, где grpid = 0000006))

Альтернативой является использование GROUP BY для группировки нескольких строк в одну.

...