Условие в Oracle Oracle не работает нормально, потому что иногда является нулевым - PullRequest
0 голосов
/ 17 октября 2018

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

AND j.id = na.source_node_id
AND na.sink_node_entity = 'Component'
AND na.source_node_entity = 'Issue'
AND na.sink_node_id = c.id

Это не будет правдой, и я не собираю эти данные (w.timeworked, если они существуют).В этих случаях я хотел бы создать c.cname с именем «Empty» и добавить в это cname все w.timeworked, где нет данных в ассоциации узлов.Любое решение для кого-то?Затем я помещаю sql:

SELECT DISTINCT c.cname                                              AS component, 
                Sum(w.timeworked / 3600) OVER ()                     AS sum_tipo, 

                Sum(w.timeworked / 3600) OVER (partition BY c.cname) AS sum_by_component 
FROM            jira.jiraissue j, 
                jira.worklog w, 
                jira.project p, 
                jira.issuetype t, 
                jira.component c, 
                (SELECT source_node_id, source_node_entity,sink_node_entity
                       ,max(sink_node_id) as sink_node_id
                    FROM jira.nodeassociation
                  GROUP BY source_node_id, source_node_entity,sink_node_entity) na, 
                jira.cwd_user u

WHERE           w.issueid=j.id 
AND             j.project=p.id 
AND             j.id= na.source_node_id 
AND             na.sink_node_entity = 'Component' 
AND             na.source_node_entity = 'Issue'
AND             na.sink_node_id=c.id 
AND             t.id=j.issuetype 
And             w.author= u.lower_user_name
AND             w.author in ( select distinct author from jira.worklog where author in (select distinct lower_user_name from jira.cwd_user where display_name in (${Autor})))   
AND             p.pname=  ${Proyecto}
AND             t.pname=${Tipo}
AND             to_char(w.startdate,'yyyy-mm-dd') >=${FromDate}
AND             to_char(w.startdate,'yyyy-mm-dd') <=${ToDate}

$ {} - это форма для передачи параметров в приложении, с которым я работаю

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

Вам нужно внешнее соединение.Вы можете сделать это с вашим текущим синтаксисом старого стиля, который я не рекомендую, просто измените эти строки:

AND             j.id= na.source_node_id (+)
AND             na.sink_node_entity (+) = 'Component' 
AND             na.source_node_entity (+) = 'Issue'
AND             c.id = nvl(na.sink_node_id, (select id from jira.component where cname = 'Empty'))

В последней строке, когда na равен нулю, он выберетjira.component строка с c.cname 'Пустой', как вы сказали.Я предполагаю, что он уже существует.

Или вы можете переписать весь ваш запрос, чтобы использовать синтаксис ANSI.

Редактировать: изменено отображение «Пусто» в качестве имени компонента вместо нуля.

SELECT DISTINCT nvl(c.cname, 'Empty')                                              AS component, 
                Sum(w.timeworked / 3600) OVER ()                     AS sum_tipo, 

                Sum(w.timeworked / 3600) OVER (partition BY c.cname) AS sum_by_component 
FROM            jira.jiraissue j
INNER JOIN jira.worklog w
    ON w.issueid=j.id 
INNER JOIN jira.project p
    ON j.project=p.id
    AND p.pname=  ${Proyecto}
INNER JOIN jira.issuetype t
    ON t.id=j.issuetype
    AND t.pname=${Tipo}
INNER JOIN jira.cwd_user u
    ON w.author= u.lower_user_name
LEFT OUTER JOIN (SELECT source_node_id, source_node_entity,sink_node_entity
                       ,max(sink_node_id) as sink_node_id
                    FROM jira.nodeassociation
                  GROUP BY source_node_id, source_node_entity,sink_node_entity) na
    ON j.id= na.source_node_id 
    AND na.sink_node_entity = 'Component' 
    AND na.source_node_entity = 'Issue'
LEFT OUTER JOIN jira.component c
    ON  c.id = na.sink_node_id
WHERE           w.author in ( select distinct author from jira.worklog where author in (select distinct lower_user_name from jira.cwd_user where display_name in (${Autor})))   
AND             to_char(w.startdate,'yyyy-mm-dd') >=${FromDate}
AND             to_char(w.startdate,'yyyy-mm-dd') <=${ToDate}
0 голосов
/ 17 октября 2018

Как говорит @AlexPoole, текущий синтаксис JOIN должен хорошо работать для выполнения внешнего объединения.Я немного изменил ваш запрос, чтобы использовать этот синтаксис:

SELECT DISTINCT c.cname                                              AS component, 
                Sum(w.timeworked / 3600) OVER ()                     AS sum_tipo, 

                Sum(w.timeworked / 3600) OVER (partition BY c.cname) AS sum_by_component 
FROM            jira.jiraissue j, 
                jira.worklog w, 
                jira.project p, 
                jira.issuetype t, 
                jira.component c,
                jira.cwd_user u
LEFT JOIN       (SELECT source_node_id, source_node_entity,sink_node_entity
                       ,max(sink_node_id) as sink_node_id
                    FROM jira.nodeassociation
                  GROUP BY source_node_id, source_node_entity,sink_node_entity) na 
             ON j.id= na.source_node_id 
            AND na.sink_node_entity = 'Component' 
            AND na.source_node_entity = 'Issue'
            AND na.sink_node_id=c.id 
WHERE           w.issueid=j.id 
AND             j.project=p.id 
AND             t.id=j.issuetype 
And             w.author= u.lower_user_name
AND             w.author in ( select distinct author from jira.worklog where author in (select distinct lower_user_name from jira.cwd_user where display_name in (${Autor})))   
AND             p.pname=  ${Proyecto}
AND             t.pname=${Tipo}
AND             to_char(w.startdate,'yyyy-mm-dd') >=${FromDate}
AND             to_char(w.startdate,'yyyy-mm-dd') <=${ToDate}

Я предлагаю вам обновить и другие объединения до текущего синтаксиса.Таким образом, он будет выглядеть чище, поскольку в предложение WHERE будут включены только фильтры и больше нет условий объединения.

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