2013-04-08 2 views
-1

Я поражен приведенным ниже сценарием. вам нужна ваша помощь в изменении моего запроса на основе приведенных ниже выборочных данных. Моя цель - создать EVENT AND EVENT_LOW, используя данные, доступные из таблиц TEM_GT и TXN.запрос oracle sql для возврата строк путем устранения дубликатов

TEM_GT (глобальная временная таблица)

est_id primary key, trans_id, trp_id, amount 
    1     111  2221  1.5 
    2     111  3332  2.0 
    3     112  4443  3.0 

TXN стол

trans_id, trans_type 
111   type1 
112   type1 

СЛУЧАЙ стол

event_id primary key, trans_id, trans_type, flag. 
    1000     111   type1  N 
    1001     112   type1  N 

EVENT_LOW таблица (финальный стол)

event_low_id primary key, event_id, est_id, amount. 
    9991      1000  1  1.5 
    9992      1000  2  2.0 
    9993      1001  3  3.0 

insert into(event_low_id, event_id, est_id, amount) 
(
    select event_low_id_s.nextval e.event_id, tg.est_id, tg.amount from 
    from TEM_GT tg, EVENT ee 
    WHERE 
      tg.trans_id = e.trans_id 
    AND e.flag   = 'N' 
); 

на основе TEM_GT и TXN GT, заполнение данных в таблице EVENT. Теперь, когда я пытаюсь заполнить данные в таблице EVENT_LOW, приведенный выше запрос возвращает 5 строк вместо 3 строк. Это связано с trp_id в таблице TEM_GT. Я не хочу добавлять trp_id в таблицу EVENT и хочу обработать дублирование в вышеупомянутом запросе select.

Я использую Oracle 11g. Пожалуйста помоги мне с этим.

Я просто построю ниже sql. Это почти разрешает мою проблему. Но иногда он возвращает другое значение для столбца суммы. Мне нужен мой результат event_low, как показано ниже для est_id .

event_low_id primary key, event_id, est_id, amount.  
    9991      1000  1  1.5  
    9992      1000  2  2.0  

Но когда-то он возвращает

event_low_id primary key, event_id, est_id, amount.  
    9991      1000  1  1.5  
    9992      1000  2  1.5  

или

event_low_id primary key, event_id, est_id, amount.  
    9991      1000  1  2.0  
    9992      1000  2  2.0 

select * 
     from (select x.*, 
        row_number() over (partition by event_id order by event_id) rn 
       from (seelct e.event_id, tg.est_id, tg.amount 
          from TEM_GT tg, EVENT e 
     WHERE 
       tg.trans_id = e.trans_id  
       AND e.flag   = 'N' 
        ) x 
      ) 
     where rn = 1 

Любая помощь в унисон его дальше, чтобы получить точный результат. Заранее спасибо

+0

Пожалуйста, измените свой пост и форматировать дизайн таблицы и код SQL образца. – alzaimar

+0

Информация в вашем вопросе не соответствует описанному вами поведению. В вашей базе данных больше строк, соответствующих SQL, чем те, которые вы показываете выше! –

+0

Вы должны проверить свой вопрос, потому что он имеет несколько ошибок: TEM_GT: est_id = 2, но это 1 для соответствующей строки в EVENT_LOW. Синтаксис вставки неверен, имя таблицы отсутствует. Причина, по которой вы получаете 5 строк, вероятно, состоит из 2 строк в EVENT с trans_is = 111. –

ответ

0

Насколько я могу судить, ваш образец запроса должен возвращать только 3 строки, основываясь на условиях.

Однако ответ на ваш вопрос, вероятно, будет использовать select distinct. Я также хотел бы предложить, используя стандартный синтаксис join:

select distinct event_low_id_s.nextval, e.event_id, tg.est_id, tg.amount 
from TEM_GT tg join 
    EVENT ee 
    on tg.trans_id = e.trans_id 
where e.flag = 'N' 

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

+0

Привет @ Gordon-linoff, я попробовал ваш запрос. Все еще получаю 4 строки для event_id 1000. Но нужно всего две строки. Да .. Я отредактировал мой запрос. –

+0

Привет, Гордон, ваш запрос дает ошибку 'ORA-02287: порядковый номер здесь не разрешен'. –

0

Мой первый инстинкт должен был использовать DISTINCT. Затем я заметил, что дубликаты имеют разные amount. Вам необходимо решить, какой amount использовать, а затем применить соответствующую функцию группы.

Пример (замените MAX и SUM, если вы предпочитаете):

select event_low_id_s.nextval e.event_id, MAX(tg.est_id), SUM(tg.amount) 
from TEM_GT tg join 
    EVENT ee 
    on tg.trans_id = e.trans_id 
where e.flag = 'N' 
group by e.event_id 
+0

Привет, Клас, На самом деле мне нужно обработать все ** количество ** (в этом случае для trans_id 111 необходимо обработать как 1.5 & 2.0). Вышеупомянутое соединение не работает. Тем не менее, я получаю 4 строки для event_id-1000. –

+0

Ahh, 'est_id' отличается. Я отредактировал свой ответ, может быть, это лучшее совпадение с тем, что вы ищете? –

+0

Привет, Klas, мне нужно обрабатывать каждый est_id отдельно. Поэтому моя таблица event_low должна иметь две строки для 'est_id' ** 1 **, а сумма ** ** не должна суммироваться. Его следует обрабатывать отдельно. 'event_low_id первичный ключ, event_id, est_id, сумма. 9991 1000 1 1,5 9992 1000 1 2.0 9993 1001 2 3,0 ' –

Смежные вопросы