针对A,B表合成一个表阿。。
意思简单点就是
A表有一列[X]是多个值。 B表也有一列[Y]是多个值。
如果[Y]只有一个值,新表中的列[Z]就是[Y]的值
,如果[Y]有两个不同,则[Z]也是[Y],不过要由[X]来决定该行对应的是什么。。不知道说清没
意思简单点就是
A表有一列[X]是多个值。 B表也有一列[Y]是多个值。
如果[Y]只有一个值,新表中的列[Z]就是[Y]的值
,如果[Y]有两个不同,则[Z]也是[Y],不过要由[X]来决定该行对应的是什么。。不知道说清没
解决方案 »
- 记事本里的数据导入oracle数据库------------------标题要长-----------------
- oracle 更新的存储过程怎么写
- 关于wm_concat函数的奇怪问题
- 一条sql查询
- 菜鸟请教两个问题
- 高分求教关于事务的问题~很急
- insert插入速度很慢的问题(高手请进,解决马上结帖)
- 帮我看一下一句话的最简单的存储过程,
- Ora-12154:TNS:无法处理服务名,如何解决?
- Oracle字符集问题求助
- 最新手的问题 数据库实例、数据库和服务名是什么关系??
- 字符集问题,我用ue把dmp文件的2,3字节改为03 54(原来为00 01) 然后IMP提示我无效的导出文件 ,why??
A表 id
B表 id type
合成一个新表C
C表 newtypeA表有一个字段id= 1001 有5行数据, B表也有一个字段的id=1001 有1行数据,且type='xxxx'
那么要合成一个5行数据的表,假设只有1个字段X
现在只针对B表,因为B表只有1行,所以新表的字段X的值 全部是B表该行的值。
所以新表
C 为
newtype
'xxxx'
'xxxx'
'xxxx'
'xxxx'
'xxxx'如果B表id=1001有2行,type='xxx','yyy'
则 C为
newtype
'xxx'
'yyy'
'xxx'
'yyy'
'xxx'
如果B表id=1001有3行,同样的 type='xxx','yyy','zzz'
则 C为
newtype
'xxx'
'yyy'
'zzz'
'xxx'
'yyy'
就是轮回分配。当然C只是id=1001的情况。
实际的新表是id=1001,1002,,,,,,的结合。
=====================
这个你说的和你给出的结果不符合。。
'2','3','4'的个数自动分配'1','2''1' 对应 '1'
'2' 对应 '2'
完了,又轮回
'3' 对应 '1'
'4'对应 '2'
....
但是怎么取出一个指定记录的所在行数呢?
A 字段1 2
x y
b z
....
不用游标能否确定2='z' ,所在行是2
??
DROP TABLE test1;
CREATE TABLE TEST(x INT,y INT);
CREATE TABLE TEST1(x INT,y INT);
BEGIN
INSERT INTO TEST (X, Y) VALUES (1, 1);
INSERT INTO TEST (X, Y) VALUES (1, 4);
INSERT INTO TEST (X, Y) VALUES (1, 3);
INSERT INTO TEST (X, Y) VALUES (1, 2);
INSERT INTO TEST (X, Y) VALUES (2, 2);
INSERT INTO TEST (X, Y) VALUES (2, 2);
INSERT INTO TEST (X, Y) VALUES (6, 5);
INSERT INTO TEST (X, Y) VALUES (6, 6);
INSERT INTO TEST (X, Y) VALUES (6, 7);
INSERT INTO TEST (X, Y) VALUES (6, 4);
INSERT INTO TEST (X, Y) VALUES (6, 4);
COMMIT;
INSERT INTO TEST1 (X, Y) VALUES (1, 1);
INSERT INTO TEST1 (X, Y) VALUES (1, 2);
INSERT INTO TEST1 (X, Y) VALUES (2, 1);
INSERT INTO TEST1 (X, Y) VALUES (3, 1);
INSERT INTO TEST1 (X, Y) VALUES (4, 1);
INSERT INTO TEST1 (X, Y) VALUES (4, 1);
INSERT INTO TEST1 (X, Y) VALUES (6, 1);
INSERT INTO TEST1 (X, Y) VALUES (6, 2);
INSERT INTO TEST1 (X, Y) VALUES (6, 3);
INSERT INTO TEST1 (X, Y) VALUES (6, 4);
COMMIT;
END;
/
WITH o2 AS (
SELECT x,
y,
ROW_NUMBER() over(PARTITION BY x ORDER BY y) ROW#,
COUNT(*) over(PARTITION BY x) z
FROM TEST1
)
SELECT x1.x,(SELECT y FROM o2 WHERE o2.ROW#=x1.y AND o2.x=x1.x)
FROM (
SELECT o1.ROW#,
o1.x,
decode(MOD(o1.ROW#, o2.z), 0, o2.z, MOD(o1.ROW#, o2.z)) y
FROM (SELECT x, ROW_NUMBER() over(PARTITION BY x ORDER BY y) ROW#
FROM TEST) o1,
o2
WHERE o1.x = o2.x
GROUP BY o1.ROW#,
o1.x,
decode(MOD(o1.ROW#, o2.z), 0, o2.z, MOD(o1.ROW#, o2.z))
ORDER BY x, ROW#) x1;
FROM (SELECT x, ROW_NUMBER() over(PARTITION BY x ORDER BY y) ROW#
FROM TEST) o1,
(SELECT x,
y,
ROW_NUMBER() over(PARTITION BY x ORDER BY y) ROW#,
COUNT(*) over(PARTITION BY x) z
FROM TEST1) o2
WHERE o1.x = o2.x
AND o2.y = decode(MOD(o1.ROW#, o2.z), 0, o2.z, MOD(o1.ROW#, o2.z));
SELECT o1.ROW#, o1.x, o2.y
FROM (SELECT x, ROW_NUMBER() over(PARTITION BY x ORDER BY y) ROW#
FROM TEST) o1,
(SELECT x,
y,
ROW_NUMBER() over(PARTITION BY x ORDER BY y) ROW#,
COUNT(*) over(PARTITION BY x) z
FROM TEST1) o2
WHERE o1.x = o2.x
AND o2.ROW# = decode(MOD(o1.ROW#, o2.z), 0, o2.z, MOD(o1.ROW#, o2.z));