這個 qes 是關于 oracle db 的。
我有一個包含幾列的表 (T1):
| 團體 | ID | 價格 |
|---|---|---|
| 一個 | 1 | 50 |
| 一個 | 5 | 40 |
| 乙 | 4 | 54 |
| C | 1 | 33 |
| C | 6 | 33 |
| D | 5 | 13 |
| D | 3 | 4 |
另一個表 (T2) 有 2 列:
| ID | 描述 |
|---|---|
| 1 | 啊啊啊 |
| 2 | bbb |
| 3 | 抄送 |
| 4 | 滴滴 |
| 5 | ee |
| 6 | 噗 |
| 7 | 嘎嘎 |
此表 (t2) 中的 Id 是唯一的。兩個表之間的連接是通過“id”列進行的。
我需要檢查 T1 中的每個(!)組(A、B、C、D),T2 中的哪個“id” - 在 T1 中找不到該組,結果需要是:組 id(在該組中不存在)
對于上表的示例,我希望得到以下結果:
| 團體 | ID |
|---|---|
| 一個 | 2 |
| 一個 | 3 |
| 一個 | 4 |
| 一個 | 6 |
| 一個 | 7 |
| 乙 | 1 |
| 乙 | 2 |
| 乙 | 3 |
| 乙 | 5 |
| 乙 | 6 |
| 乙 | 7 |
| C | 2 |
| C | 3 |
| C | 4 |
| C | 5 |
| C | 7 |
| D | 1 |
| D | 2 |
| D | 4 |
| D | 6 |
| D | 7 |
謝謝!
uj5u.com熱心網友回復:
在 Oracle 中,您可以使用磁區連接
with a(grp, id, price) as ( select 'A', 1, 50 from dual union all select 'A', 5, 40 from dual union all select 'B', 4, 54 from dual union all select 'C', 1, 33 from dual union all select 'C', 6, 33 from dual union all select 'D', 5, 13 from dual union all select 'D', 3, 4 from dual ) , b (id, descr) as ( select 1, 'aaa' from dual union all select 2, 'bbb' from dual union all select 3, 'ccc' from dual union all select 4, 'ddd' from dual union all select 5, 'eee' from dual union all select 6, 'fff' from dual union all select 7, 'ggg' from dual ) select grp , id from a partition by (grp) right join b using (id) where a.price is null order by grp, id玻璃鋼 | ID :-- | -: 一個 | 2 一個 | 3 一個 | 4 一個 | 6 一個 | 7 乙 | 1 乙 | 2 乙 | 3 乙 | 5 乙 | 6 乙 | 7 C | 2 C | 3 C | 4 C | 5 C | 7 D | 1 D | 2 D | 4 D | 6 D | 7
db<>在這里擺弄
uj5u.com熱心網友回復:
這里的想法是通過使用笛卡爾連接創建所有可能的記錄組合,然后匹配所有組并選擇不存在的通過left join和not null
create table T1 (c1 varchar2(10), c2 number(10), c3 number(10))
insert into T1 values('A', 1, 50);
insert into T1 values('A', 5, 40);
insert into T1 values('B', 4 , 54);
insert into T1 values('C', 1, 33);
insert into T1 values('C', 6, 33);
insert into T1 values('D', 5, 13);
insert into T1 values('D', 3, 4);
create table T2 (c6 number(10), c7 varchar2(10))
insert into T2 values( 1, 'aaa');
insert into T2 values( 2, 'bbb');
insert into T2 values( 3, 'ccc');
insert into T2 values( 4, 'ddd');
insert into T2 values( 5, 'eee');
insert into T2 values( 6, 'fff');
insert into T2 values( 7, 'ggg');
SELECT tx.c1, tx.c6, ty.c1
FROM
(select c1, c6
from
(select distinct c1 from T1) ta,
(select distinct c6 from T2) tb) tx -- tx is the cartisian product
left join
(select c1, c2 from T1 group by c1, c2) ty
on tx.c1 = ty.c1 and tx.c6 = ty.c2
WHERE
ty.c1 is null
ORDER BY 1, 2
這正是您要找的東西。經過測驗和驗證
uj5u.com熱心網友回復:
首先,找出所有可能的組合,然后確定哪些組合不存在:
WITH cteCombinations
AS (SELECT DISTINCT T1."group", T2.ID
FROM T1
CROSS JOIN T2)
SELECT c."group", c.ID
FROM cteCombinations c
LEFT OUTER JOIN T1
ON T1.ID = c.ID AND
T1."group" = c."group"
WHERE T1.ID IS NULL
ORDER BY c."group", c.ID
CTE(Common Table Expression)使用 CROSS JOIN 來查找 group 和 ID 的所有唯一組合;然后LEFT OUTER JOIN用于確定哪些組合在 T1 中不存在。
另一種方法是:
WITH cteCombinations
AS (SELECT DISTINCT T1."group", T2.ID
FROM T1
CROSS JOIN T2)
SELECT c."group", c.ID
FROM cteCombinations c
WHERE (c."group", c.ID) NOT IN (SELECT "group", ID
FROM T1)
ORDER BY c."group", c.ID
這里我們使用相同的 CTE 來生成可能的組合,但LEFT OUTER JOIN我們使用NOT IN比較來確定哪些組合不存在于表 T1 中。
db<>在這里擺弄
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/395588.html
上一篇:Oracle移植自然JOIN
