17,082
社区成员
发帖
与我相关
我的任务
分享
WITH T_MAN AS
(SELECT '张三' AS NAME, '上海' AS CITY, '程序员' AS JOB
FROM DUAL
UNION ALL
SELECT '李四' AS NAME, '上海' AS CITY, '美工' AS JOB
FROM DUAL /* union all
select '王五' as name, '上海' as city, '教师' as job from dual */
),
T_WOMAN AS
(SELECT '小丽' AS NAME, '上海' AS CITY, '策划' AS JOB
FROM DUAL
UNION ALL
SELECT '小红' AS NAME, '上海' AS CITY, '程序员' AS JOB
FROM DUAL
UNION ALL
SELECT '小冰' AS NAME, '上海' AS CITY, '个体户' AS JOB
FROM DUAL),
T_PD AS
(SELECT A.NAME AS M_NAME, B.NAME AS W_NAME, ROWNUM AS R
FROM T_MAN A
FULL JOIN T_WOMAN B
ON A.CITY = B.CITY
AND A.JOB <> B.JOB),
T_PD_NEW(M_NAME,
W_NAME,
R,
PD_HIS,
FLAG) AS
(SELECT M_NAME, W_NAME, R,
CAST(',' || M_NAME || ',' || W_NAME || ',' AS VARCHAR2(4000)), 1
FROM T_PD
WHERE R = 1
UNION ALL
SELECT B.M_NAME, B.W_NAME, A.R + 1,
CASE
WHEN INSTR(A.PD_HIS, ',' || B.M_NAME || ',') > 0 OR
INSTR(A.PD_HIS, ',' || B.W_NAME || ',') > 0 THEN
A.PD_HIS
ELSE
A.PD_HIS || B.M_NAME || ',' || B.W_NAME || ','
END,
CASE
WHEN INSTR(A.PD_HIS, ',' || B.M_NAME || ',') > 0 OR
INSTR(A.PD_HIS, ',' || B.W_NAME || ',') > 0 THEN
0
ELSE
1
END
FROM T_PD_NEW A, T_PD B
WHERE A.R + 1 = B.R)
SELECT T1.*, T2.*
FROM (SELECT *
FROM T_PD_NEW
WHERE FLAG = 1) T
--回头找出光棍
FULL JOIN T_MAN T1
ON T1.NAME = T.M_NAME
FULL JOIN T_WOMAN T2
ON T2.NAME = T.W_NAME
select a.*,b.*
from (select t.*,t.rownum rm from a t) a,
(select t.*,t.rownum rm from b t) b
where arm=b.rm;
凑个热闹,没有排序,按行顺序匹配
-- 借 1# 数据,凑个人数
SQL>
SQL> with a as
2 (select 1 id, 20 age, '20140102' ts
3 from dual
4 union all
5 select 2, 25, '20150602'
6 from dual
7 union all
8 select 3, 28, '20110223'
9 from dual),
10 b as
11 (select 1 id, 30 age, '20141122' ts
12 from dual
13 union all
14 select 2, 22, '20150302'
15 from dual
16 union all
17 select 3, 43, '20170123'
18 from dual)
19 select
20 rm,
21 max(decode(tp,1,id)) id_a,
22 max(decode(tp,2,id)) id_b,
23 max(decode(tp,1,age)) age_a,
24 max(decode(tp,2,age)) age_b,
25 max(decode(tp,1,ts)) ts_a,
26 max(decode(tp,2,ts)) ts_b
27 from (
28 select id, age, ts, ROW_NUMBER() over(order by ts desc) rm,1 tp from a
29 union all
30 select id, age, ts, ROW_NUMBER() over(order by ts desc) rm,2 tp from b
31 )
32 group by rm;
RM ID_A ID_B AGE_A AGE_B TS_A TS_B
---------- ---------- ---------- ---------- ---------- -------- --------
1 2 3 25 43 20150602 20170123
2 1 2 20 22 20140102 20150302
3 3 1 28 30 20110223 20141122
SQL>
with a as
(select 1 id, 20 age, '20140102' ts
from dual
union all
select 2, 25, '20150602'
from dual
union all
select 3, 28, '20110223'
from dual),
b as
(select 1 id, 30 age, '20141122' ts
from dual
union all
select 2, 22, '20150302'
from dual
union all
select 3, 43, '20170123'
from dual)
select aa.id, aa.age, bb.id, bb.age, aa.ts, bb.ts
from (select id, age, ts, ROW_NUMBER() over(order by ts desc) rm from a) aa,
(select id, age, ts, ROW_NUMBER() over(order by ts desc) rm from b) bb
where aa.rm = bb.rm
select aa.*,bb.* from
(select a.* from a order by city,ts) aa
full join
(select b.* from b order by city,ts) bb on aa.city=bb.city