Напишите запрос в Oracle, чтобы получить все строки, которые удовлетворяют условию на основе полученных данных. - PullRequest
0 голосов
/ 29 апреля 2020

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

select it.itemname, pr.npd
from rtrprdb.jpipelinesystem pl join
     rtrprdb.jnameditem it on it.oid = pl.oid join
     rtrprdb.xsystemhierarchy x on x.oidorigin = pl.oid join
     rtrprdb.jrtepiperun pr on pr.oid = x.oiddestination
order by it.itemname desc;

Первые пять строк этого запроса дают следующий результат:

W-9244  1.5
W-9244  1.5
W-9244  1.5
W-9243  2.0
W-9243  1.5

Эти строки показывают конвейеры W -9244 и W-9243 вполне могут быть использованы для иллюстрации моего намерения. Я хотел бы выбрать конвейеры с несколькими значениями для npd. Например, я хотел бы выбрать W-9243, поскольку он имеет два значения npd: 2,0 и 1,5. С другой стороны, я не заинтересован в выборе W-9244, потому что он имеет только одно значение npd 1,5.

Я попытался изменить запрос, как показано ниже, но безуспешно:

select it.itemname, pr.npd
from rtrprdb.jpipelinesystem pl join
     rtrprdb.jnameditem it on it.oid = pl.oid join
     rtrprdb.xsystemhierarchy x on x.oidorigin = pl.oid join
     rtrprdb.jrtepiperun pr on pr.oid = x.oiddestination
group by it.itemname, pr.npd
having count(*) > 1
order by it.itemname desc;

Ответы [ 3 ]

0 голосов
/ 29 апреля 2020

Попробуйте использовать разные в функции подсчета

select it.itemname, pr.npd
from rtrprdb.jpipelinesystem pl join
     rtrprdb.jnameditem it on it.oid = pl.oid join
     rtrprdb.xsystemhierarchy x on x.oidorigin = pl.oid join
     rtrprdb.jrtepiperun pr on pr.oid = x.oiddestination
group by it.itemname, pr.npd
having count(distinct npd) > 1
order by it.itemname desc;
0 голосов
/ 29 апреля 2020

Я не совсем уверен в вашем вопросе, хотите ли вы только отдельные значения ITEMNAME, которые связаны с несколькими значениями NPD; если вам нужны разные комбинации ITEMNAME и NPD, где ITEMNAME имеет несколько значений NPD; или если вы хотите, чтобы все значения NPD для каждого ИМЯ ПУНКТА, которые имеют несколько значений NPD. Итак, давайте сделаем их все:

Чтобы получить отдельные ИМЯ, связанные с несколькими значениями NPD, вы можете использовать:

WITH cteBase_data AS
       (SELECT it.ITEMNAME, pr.NPD
          FROM RTRPRDB.JPIPELINESYSTEM pl
          INNER JOIN RTRPRDB.JNAMEDITEM it
            ON it.OID = pl.OID
          INNER JOIN RTRPRDB.XSYSTEMHIERARCHY x
            ON x.OIDORIGIN = pl.OID
          INNER JOIN RTRPRDB.JRTEPIPERUN pr
            ON pr.OID = x.OIDDESTINATION),
     cteItems_of_interest AS
       (SELECT ITEMNAME
          FROM (SELECT DISTINCT ITEMNAME, NPD
                  FROM cteBase_data)
          GROUP BY ITEMNAME
          HAVING COUNT(*) > 1)
SELECT ii.ITEMNAME
  FROM cteItems_of_interest ii
  ORDER BY ii.ITEMNAME

Чтобы получить различные комбинации ИМЯНЯ и NPD для всех ИМЕНИ с Несколько значений NPD, которые вы можете использовать:

WITH cteBase_data AS
       (SELECT it.ITEMNAME, pr.NPD
          FROM RTRPRDB.JPIPELINESYSTEM pl
          INNER JOIN RTRPRDB.JNAMEDITEM it
            ON it.OID = pl.OID
          INNER JOIN RTRPRDB.XSYSTEMHIERARCHY x
            ON x.OIDORIGIN = pl.OID
          INNER JOIN RTRPRDB.JRTEPIPERUN pr
            ON pr.OID = x.OIDDESTINATION),
     cteItems_of_interest AS
       (SELECT ITEMNAME
          FROM (SELECT DISTINCT ITEMNAME, NPD
                  FROM cteBase_data)
          GROUP BY ITEMNAME
          HAVING COUNT(*) > 1)
SELECT DISTINCT bd.ITEMNAME, bd.NPD
  FROM cteBase_data bd
  INNER JOIN cteItems_of_interest ii
    ON ii.ITEMNAME = bd.ITEMNAME
  ORDER BY ITEMNAME, NPD

И чтобы получить все строки, в которых ITEMNAME связан с несколькими значениями NPD, вы можете использовать:

WITH cteBase_data AS
       (SELECT it.ITEMNAME, pr.NPD
          FROM RTRPRDB.JPIPELINESYSTEM pl
          INNER JOIN RTRPRDB.JNAMEDITEM it
            ON it.OID = pl.OID
          INNER JOIN RTRPRDB.XSYSTEMHIERARCHY x
            ON x.OIDORIGIN = pl.OID
          INNER JOIN RTRPRDB.JRTEPIPERUN pr
            ON pr.OID = x.OIDDESTINATION),
     cteItems_of_interest AS
       (SELECT ITEMNAME
          FROM (SELECT DISTINCT ITEMNAME, NPD
                  FROM cteBase_data)
          GROUP BY ITEMNAME
          HAVING COUNT(*) > 1)
SELECT bd.ITEMNAME, bd.NPD
  FROM cteBase_data bd
  INNER JOIN cteItems_of_interest ii
    ON ii.ITEMNAME = bd.ITEMNAME
  ORDER BY ITEMNAME, NPD

дБ <> скрипка здесь

0 голосов
/ 29 апреля 2020

Если вам нужны только имена, а не значения npd:

select it.itemname
from rtrprdb.jpipelinesystem pl join
     rtrprdb.jnameditem it
     on it.oid = pl.oid join
     rtrprdb.xsystemhierarchy x
     on x.oidorigin = pl.oid join
     rtrprdb.jrtepiperun pr 
     on pr.oid = x.oiddestination
group by it.itemname
having count(distinct pr.npd) > 1
order by it.itemname desc;

Если вы хотите включить значения, вы можете сделать это в виде строки:

select it.itemname,
       listagg(pr.npd, ',') within group (order by pr.npd)

Наконец, если вы действительно хотите оригинальные строки:

select itemname, npd
from (select it.itemname, pr.npd, count(*) over (partition by it.itemname) as cnt
      from rtrprdb.jpipelinesystem pl join
           rtrprdb.jnameditem it
           on it.oid = pl.oid join
           rtrprdb.xsystemhierarchy x
           on x.oidorigin = pl.oid join
           rtrprdb.jrtepiperun pr 
           on pr.oid = x.oiddestination
      group by it.itemname, pr.npd
     ) ip
where cnt > 1
order by it.itemname desc;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...