ORA-01427: однострочный подзапрос возвращает более одной строки, рассчитайте разницу между двумя ревизиями - PullRequest
0 голосов
/ 06 февраля 2020

мой запрос выглядит следующим образом:

select distinct p.CONTRACTNUM  as Contract,c.NAME as Name,
    (select 
        (select trunc(enddate) from maximo.contract where revisionnum = revisionnum ) - 
        (select trunc(enddate) from maximo.contract where revisionnum = revisionnum-1 )
     from dual) as "Current Value Variation"
From Maximo.Purchview P
JOIN  Maximo.Expedite E   
  ON  P.Contractnum=E.Maxid 
JOIN  Maximo.Companies C
  ON  C.Company=P.Vendor 
Where E.Maxapp='CP'
  And P.status ='EXCUTE'
  And P.ENDDATE>sysdate
order by P.Contractnum;

Я получаю исключение ORA-01427: однострочный подзапрос возвращает более одной строки, чтобы вычислить разницу между двумя ревизиями для одной и той же записи и расположенными в " Колонка «Текущее значение».

для тех, кто запрашивает образец. Вывод должен быть таким:

Contract    Name             Revision   End Date       Value Variation      
 123        Sample Name       0           25-Dec-19     0
 123        Sample Name       1           25-Jun-20     183

Ответы [ 2 ]

0 голосов
/ 06 февраля 2020
select trunc(enddate) from maximo.contract where revisionnum = revisionnum

Не коррелирует один revisionnum с вложенным запросом, а другой revisionnum с внешним запросом; он будет использовать revisionnum в локальной области видимости для обоих и будет возвращать каждую строку. Используйте псевдонимы таблицы, чтобы указать, куда вы хотите применить revsionnum:

select distinct
    p.CONTRACTNUM as Contract,
    c.NAME as Name,
    ( select trunc(enddate)
      from   maximo.contract c1               -- Add table alias
      where  c1.revisionnum = p.revisionnum   -- use aliases
    ) - 
    ( select trunc(enddate)
      from   maximo.contract c2               -- Add table alias
      where  c2.revisionnum = p.revisionnum-1 -- use aliases
    ) as "Current Value Variation"
From Maximo.Purchview P
JOIN  Maximo.Expedite E   
  ON  P.Contractnum=E.Maxid 
JOIN  Maximo.Companies C
  ON  C.Company=P.Vendor 
Where E.Maxapp='CP'
  And P.status ='EXCUTE'
  And P.ENDDATE>sysdate
order by P.Contractnum;

(Предполагая, что revisionnum находится в PurchView, если нет, тогда используйте правильный псевдоним, как мы этой информации нет.)

Если вам необходимо дополнительно соотнести контракт с PurchView, добавьте это к условиям фильтра вложенного запроса:

select distinct
    p.CONTRACTNUM as Contract,
    c.NAME as Name,
    ( select trunc(enddate)
      from   maximo.contract c1               -- Add table alias
      where  c1.revisionnum = p.revisionnum   -- use aliases
      and    c1.contractnum = p.contactnum    -- add additional filters
    ) - 
    ( select trunc(enddate)
      from   maximo.contract c2               -- Add table alias
      where  c2.revisionnum = p.revisionnum-1 -- use aliases
      and    c2.contractnum = p.contactnum    -- add additional filters
    ) as "Current Value Variation"
From Maximo.Purchview P
JOIN  Maximo.Expedite E   
  ON  P.Contractnum=E.Maxid 
JOIN  Maximo.Companies C
  ON  C.Company=P.Vendor 
Where E.Maxapp='CP'
  And P.status ='EXCUTE'
  And P.ENDDATE>sysdate
order by P.Contractnum;
0 голосов
/ 06 февраля 2020

Я предполагаю, что таблица maximo.contract содержит CONTRACTNUM и может использоваться для фильтрации подзапроса по одному результату на строку

select distinct p.CONTRACTNUM  as Contract,c.NAME as Name,
    (select 
        (select trunc(enddate) from maximo.contract a where revisionnum = revisionnum and a.CONTRACTNUM  =  p.CONTRACTNUM) - 
        (select trunc(enddate) from maximo.contract a where revisionnum = revisionnum-1 and a.CONTRACTNUM  =  p.CONTRACTNUM)
     from dual a ) as "Current Value Variation"
From Maximo.Purchview P
JOIN  Maximo.Expedite E   
  ON  P.Contractnum=E.Maxid 
JOIN  Maximo.Companies C
  ON  C.Company=P.Vendor 
Where E.Maxapp='CP'
  And P.status ='EXCUTE'
  And P.ENDDATE>sysdate
order by P.Contractnum;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...