我一直在互联网上寻找解决此问题的方法,但似乎没有人在之前提出这个问题。
2个不相关的表格,每个x列。我想要一个非常简单的结果:让2列彼此相邻,但行对应(row1-row1,row2-row2)。
I will elaborate in case it isn't clear to someone:
___________________
-What I want to do, is to put 2 columns one next to each other:
-table1.column1
-table2.column1
So the result would be something like this:
table1.column1.ROW1 - table2.column1.ROW1
table1.column1.ROW2 - table2.column1.ROW2
table1.column1.ROW3 - table2.column1.ROW3
table1.column1.ROW4 - table2.column1.ROW4
table1.column1.ROW5 - table2.column1.ROW5
..etc..
___________________
像" SELECT table1.column1,table2.column1 FROM table1,table2" 这样的查询不会给我想要的结果,因为它输出行*行
如果有人想知道为什么这个世界我需要将2个不相关的列从2个不相关的表中放在一起:我的工作是去银行,拿走他们的数据库与客户'信息,并掩盖所有数据(以某种方式,而不是随机)。 最后,我有银行的原始表及其完美克隆 - 克隆表由掩码数据填充。 在那时,关键部分开始了:
为了确保所有数据都已正确屏蔽,遵守客户(银行)的所有标准,我需要将第X列的所有数据放在Y列的所有数据旁边, (row1-row1; row2-row2; etc)。
我目前所做的是采取数十个印刷品并进行比较,这浪费了很多很多时间。
如果有人能想出解决这个问题的方法,我会永远感激不尽。
我还应该提到我没有任何东西可以加入,因为table1中的所有数据与table2中的所有数据完全不同,没有任何共同之处。
解决方案由用户提供,并且运行良好。 查询为:
选择table1.COLUMN,table2.COLUMN
from(select rownum as rn1,table1.COLUMN from YOURTABLE1.COLUMN table1)table1
join(选择rownum为rn2,table2.COLUMN来自YOURTABLE2.COLUMN table2)table2
on table1.rn1 = table2.rn2;
当您将此查询调整到表格时,请记住,您必须仅替换我在“资本”中写下的字词。字母。
该查询也适用于较大的数据集。我已经在100.000行上测试了它,每行都在他的位置,“rownum”#r;功能根本不会改变它们。
这是最好和最快的方法,将2列彼此相邻,并且它们的行匹配,来自2个不同的表(在我的情况下也是2个不同的用户),他们绝对没有加入时常见。
答案 0 :(得分:1)
即使我们屏蔽了数据,也应该有一些列具有两个表共有的数据。请查看常用数据的主键列和标识列 - 建议。
我们可以根据您的要求显示基于使用joins
。
很高兴进一步帮助
这是查询。试试这样的事情
create table table1(column1 varchar(255),column2 varchar(255));
insert into table1(column1,column2)values('a','a1');
--create temp table1
create GLOBAL TEMPORARY TABLE temp1(rownumber int,column1,column2);
insert into temp1 select Row_Number() Over(order by column1),column1,column2 from table1;
--create table2
create table table2(column1 varchar(255),column2 varchar(255));
insert into table2(column1,column2)values('b','b1');
--create temp table2
create GLOBAL TEMPORARY TABLE temp2(rownumber int,column1,column2);
insert into temp2 select Row_Number() Over(order by column1),column1,column2 from table1;
--join based on rownumber
select temp1.column1,temp2.column1 from temp1 join temp2 on temp1.rownumber=temp2.rownumber;
希望这会有所帮助。这应该可以解决问题。
答案 1 :(得分:0)
INNER JOIN
您的表格上都有客户ID号。
答案 2 :(得分:0)
必须有一些东西要加入'上。例如,假设两个表中的每一行都有一个ClientID列
SELECT table1.column1, table2.column1 FROM table1
INNER JOIN table2 ON table2.ClientID = table1.ClientID
答案 3 :(得分:0)
不幸的是,你所要求的是不可能的。
简单地并排执行select * from table1
和select * from table2
并不会像您期望的那样神奇地配对行。这是因为您无法控制Oracle如何在内部选择存储行,或者如何将它们返回给您(除非您指定ORDER BY
子句)。这甚至没有考虑到Oracle可以在更新值时根据需要移动行。
我的建议:重新启动屏蔽过程。现在还不晚,对吧?您仍然拥有原始数据。
但是这一次,在你做之前,在名为table1
的{{1}}上添加一个新列。它不需要具有一些特殊价值。您可以使用序列自动生成它。只需通过在其上创建唯一约束来确保每行的ID是唯一的,或者更好的是,将其定义为主键。
然后,当您屏蔽所有数据并将其放入Id
时,请确保将此table2
值存储在Id
的相应行中。
只有这样,您才能通过以下查询完成您的要求:
table2
没有办法解决这个问题。
修改强>
您要求的是此查询:
select t1.*, t2.*
from t1
join t2 on t2.Id = t1.Id
但是,我真的不知道你的行怎么会像你期望的那样神奇地匹配。希望你能意识到这一点。如果是这样,我强烈建议你考虑我上面的其他选择。
编辑2:
在Oracle方面,我可能不是一个可靠的信息来源。但汤姆凯特是。请阅读以下主题和他的答案。我认为这有助于您更好地理解问题:
https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:6257473400346237629
答案 4 :(得分:0)
您可以使用ROW_NUMBER() OVER (...)
或ROWNUM
生成伪列以加入表。如果您希望按特定顺序加入表格,则可以使用ROW_NUMBER() OVER (ORDER BY column_name)
。
Oracle 11g R2架构设置:
CREATE TABLE random1 ( ID1, VALUE1 ) AS
SELECT 1, 20 FROM DUAL
UNION ALL SELECT 5, 32 FROM DUAL
UNION ALL SELECT 3, 5 FROM DUAL;
CREATE TABLE random2 ( ID2, VALUE2 ) AS
SELECT 6, 17 FROM DUAL
UNION ALL SELECT 4, 10 FROM DUAL
UNION ALL SELECT 2, 7 FROM DUAL;
查询1 :
SELECT ID1,
ID2,
VALUE1 - VALUE2 AS difference
FROM ( SELECT ID1,
VALUE1,
ROW_NUMBER() OVER ( ORDER BY NULL ) AS RN
FROM RANDOM1 ) a
INNER JOIN
( SELECT ID2,
VALUE2,
ROW_NUMBER() OVER ( ORDER BY NULL ) AS RN
FROM RANDOM2 ) b
ON ( a.RN = b.RN )
<强> Results 强>:
| ID1 | ID2 | DIFFERENCE |
|-----|-----|------------|
| 1 | 6 | 3 |
| 5 | 4 | 22 |
| 3 | 2 | -2 |
查询2 :
SELECT ID1,
ID2,
VALUE1 - VALUE2 AS difference
FROM ( SELECT ID1,
VALUE1,
ROWNUM AS RN
FROM RANDOM1 ) a
INNER JOIN
( SELECT ID2,
VALUE2,
ROWNUM AS RN
FROM RANDOM2 ) b
ON ( a.RN = b.RN )
<强> Results 强>:
| ID1 | ID2 | DIFFERENCE |
|-----|-----|------------|
| 1 | 6 | 3 |
| 5 | 4 | 22 |
| 3 | 2 | -2 |