簡體   English   中英

ORACLE查詢,如果一行滿足FK條件,則忽略所有行

[英]ORACLE query, Ignore all rows if one row meets condition for FK

我有一張數據如下的表。 我的要求是,如果FK的類別為M,則忽略FK的所有行。查詢應僅返回類別為N且類型為Z的那些行。而且,FK也由(在(A,B))中給出,基本上在下面的示例i中需要輸出作為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

謝謝

為什么不嘗試

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

SQL小提琴

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    ║
╚════╩════╩══════════╩══════╝

最簡單但可能不是最有效的是

SELECT * 
FROM tab_name
WHERE FK not in (SELECT FK FROM tab_name WHERE catergory='M')

嘗試這個。

 SELECT *
  FROM table_name
 WHERE Category = 'N' 
     AND Type = 'Z' 
     AND FK IN ('A', 'B');

嘗試這個

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')

您似乎想要:

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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM