[英]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')
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.