ORACLE запрос, игнорировать все строки, если одна строка соответствует условию для FK - PullRequest
0 голосов
/ 28 июня 2018

У меня есть таблица с данными, как показано ниже. Мое требование - игнорировать все строки для FK, если FK имеет категорию M. Запрос должен возвращать только те строки, у которых категория N и тип Z. Кроме того, FK также задается как (в (A, B)) В основном в приведенном ниже примере мне нужно, чтобы вывод был строкой для PK 5.

PK  FK  Category    Type
1   A       L       X
2   A       M       Y
3   A       N       Z
4   B       L       X
5   B       N       Z
6   C       L       X
7   C       M       Y
8   C       N       Z

Спасибо

Ответы [ 5 ]

0 голосов
/ 28 июня 2018

Казалось бы, вы хотите:

select t.*
from t
where t.category = 'N' and t.type = 'Z' and
      not exists (select 1 
                  from t t2
                  where t2.fk = t.fk and t2.category = 'M'
                 );

Вы также можете использовать аналитические функции:

select t.*
from (select t.*,
             sum(case when category = 'M' then 1 else end) over (partition by fk) as m_cnt
      from t
     ) t
where category = 'N' and type = 'Z' and
      m_cnt = 0;
0 голосов
/ 28 июня 2018

Попробуйте это

Select PK, FK, Category, Type
From tab_name
Where Category = Case when Category = 'M' Then 'N' else Category end
and Type = Case when Category = 'M' Then 'Z' else Type end
and FK in ('A', 'B')
0 голосов
/ 28 июня 2018

Простейшим, но не самым эффективным является

SELECT * 
FROM tab_name
WHERE FK not in (SELECT FK FROM tab_name WHERE catergory='M')
0 голосов
/ 28 июня 2018

Попробуйте это.

 SELECT *
  FROM table_name
 WHERE Category = 'N' 
     AND Type = 'Z' 
     AND FK IN ('A', 'B');
0 голосов
/ 28 июня 2018

Почему бы не попробовать как

   SELECT *
  FROM tab_name
 WHERE     UPPER (category) = 'N'
       AND UPPER (type) = 'Z'
       AND UPPER (fk) IN ('A', 'B')

SQL Fiddle

WITH t
     AS (SELECT 1 AS pk,
                'A' AS fk,
                'L' AS category,
                'X' AS TYPE
           FROM DUAL
         UNION
         SELECT 2 AS pk,
                'A' AS fk,
                'M' AS category,
                'Y' AS TYPE
           FROM DUAL
         UNION
         SELECT 3 AS pk,
                'A' AS fk,
                'N' AS category,
                'Z' AS TYPE
           FROM DUAL
         UNION
         SELECT 4 AS pk,
                'B' AS fk,
                'L' AS category,
                'X' AS TYPE
           FROM DUAL
         UNION
         SELECT 5 AS pk,
                'B' AS fk,
                'N' AS category,
                'Z' AS TYPE
           FROM DUAL
         UNION
         SELECT 6 AS pk,
                'C' AS fk,
                'L' AS category,
                'X' AS TYPE
           FROM DUAL
         UNION
         SELECT 7 AS pk,
                'C' AS fk,
                'M' AS category,
                'Y' AS TYPE
           FROM DUAL
         UNION
         SELECT 8 AS pk,
                'C' AS fk,
                'N' AS category,
                'Z' AS TYPE
           FROM DUAL)
(SELECT distinct *
   FROM t
  WHERE     UPPER (category) = 'N'
        AND UPPER (TYPE) = 'Z'
        AND UPPER (fk) IN ('A', 'B'))

выход

╔════╦════╦══════════╦══════╗
║ PK ║ FK ║ CATEGORY ║ TYPE ║
╠════╬════╬══════════╬══════╣
║  3 ║ A  ║ N        ║ Z    ║
║  5 ║ B  ║ N        ║ Z    ║
╚════╩════╩══════════╩══════╝
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...