[英]ORACLE SQL compare two or more rows in same table
我有一個值與此類似的表
Uname | Grp_ID | Role_ID
---------------------
usr1 | 10 | 1032
usr1 | 10 | 1034
usr1 | 20 | 1032
usr1 | 20 | 1034
usr1 | 30 | 1032
usr1 | 40 | 1032
usr1 | 50 | 1034
usr1 | 50 | 1034
usr1 | 60 | 1018
usr1 | 70 | 1057
我想要輸出具有1032和1034(兩者)作為角色ID的Grp_ID,例如,
Grp_ID 10 has 1032 and 1034 as ROle_IDs
Grp_ID 20 has 1032 and 1034 as ROle_IDs
Grp_ID 30、40、50、60、70不同時具有1032和1034作為Role_ID
我已經嘗試過使用內部聯接和“具有”,但似乎沒有得到我想要的。
Select t1.uname, t2.grp_id, t1.role_id from table_name t1
left join table_name t2 on t1.grp_is = t2.grp_id
Where t1.role_id = 1032 and t2.role_id = 1034
您需要做的是在組ID上將表連接到自身,然后過濾包含兩個角色ID的行。 聯接中涉及的每個表都扮演不同的角色。 如果需要過濾3個值,則需要3個表子句(兩個聯接)。
WITH thetable AS (
SELECT 10 grpid, 1032 roleid FROM dual UNION ALL
SELECT 10 grpid, 1034 roleid FROM dual UNION ALL
SELECT 20 grpid, 1032 roleid FROM dual UNION ALL
SELECT 20 grpid, 1034 roleid FROM dual UNION ALL
SELECT 30 grpid, 1032 roleid FROM dual UNION ALL
SELECT 40 grpid, 1032 roleid FROM dual UNION ALL
SELECT 50 grpid, 1034 roleid FROM dual UNION ALL
SELECT 50 grpid, 1034 roleid FROM dual UNION ALL
SELECT 60 grpid, 1018 roleid FROM dual UNION ALL
SELECT 70 grpid, 1057 roleid FROM dual
)
SELECT t1.grpid, t1.roleid, t2.roleid
FROM thetable t1
JOIN thetable t2 ON t1.grpid = t2.grpid
WHERE t1.roleid = 1032 AND t2.roleid = 1034;
groupid roleid roleid_1
10 1032 1034
20 1032 1034
我喜歡使用group by
和having
來解決這些問題。 在這種情況下:
select grp_id
from tbl
where role_id in (1032, 1034)
group by grp_id
having count(distinct role_id) = 2;
我發現這種方法可以推廣到套集問題的許多變體中。
只是提供不同的答案:
SELECT GrpID FROM theTable WHERE roleId = 1032
INTERSECT
SELECT GrpID FROM theTable WHERE roleID = 1034
要么
SELECT 'Grp_ID '|| GRPID ||' has 1032 and 1034 as Role_IDs'
FROM theTable
WHERE roleId = 1032
INTERSECT
SELECT 'Grp_ID '|| GRPID ||' has 1032 and 1034 as Role_IDs'
FROM theTable
WHERE roleID = 1034
如果您需要問題中的全文...
但是我不是很喜歡在SQL表示層中添加這樣的文本,所以應該注意這一點。
就像@jarlh所說的那樣。 在這里我不使用uname
過濾器
with tbl (Uname,Grp_ID,Role_ID) as
( select 'usr1',10,1032 from dual union all
select 'usr1',10,1034 from dual union all
select 'usr1',20,1032 from dual union all
select 'usr1',20,1034 from dual union all
select 'usr1',30,1032 from dual union all
select 'usr1',40,1032 from dual union all
select 'usr1',50,1034 from dual union all
select 'usr1',50,1034 from dual union all
select 'usr1',60,1018 from dual union all
select 'usr1',70,1057 from dual
)
--Query
select grp_id
,count(distinct role_id) as count_dist_role_id
from tbl
where Role_ID in (1032,1034)
group by grp_id
having count(distinct role_id)=2
產量
+--------+--------------------+
| GRP_ID | COUNT_DIST_ROLE_ID |
+--------+--------------------+
| 20 | 2 |
| 10 | 2 |
+--------+--------------------+
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.