[英]SQL to combine 2 unrelated columns from 2 unrelated tables
我一直在互联网上寻找解决此问题的方法,但之前似乎没有人问过这个问题。
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"这样的查询不会给我想要的结果,因为它输出 rows*rows 。
万一有人想知道为什么我需要将 2 个不相关的表中的 2 个不相关的列放在一起:我的工作是去银行,用客户的信息获取他们的数据库,并屏蔽所有数据(以某种方式,不是随机的)。 最后,我得到了银行的原始表及其完美克隆 - 由屏蔽数据填充的克隆表。 在这一点上,关键部分开始了:
为了确保所有数据都被正确屏蔽,尊重客户(银行)的所有标准,我需要将 X 列中的所有数据放在 Y 列中的所有数据旁边(第 1- row1 ; row2-row2 ; 等)。
我现在所做的,就是拿几十个打印屏幕来比较它们,这浪费了很多很多很多时间。
如果有人能想出解决这个问题的办法,我将永远感激不尽。
我还应该提到我没有什么可加入的,因为 table1 中的所有数据与 table2 中的所有数据完全不同,没有任何共同之处。
解决方案由用户 'sstan' 提供,并且运行良好。 查询是:
选择 table1.COLUMN, table2.COLUMN
from (select rownum as rn1, table1.COLUMN from YOURTABLE1.COLUMN table1) table1
加入(选择 rownum 作为 rn2,table2.COLUMN from YOURTABLE2.COLUMN table2)table2
在 table1.rn1 = table2.rn2 上;
当您将此查询调整到您的表格时,请记住,您必须仅替换我用“大写”字母书写的单词。
该查询也适用于较大的数据集。 我已经在 100.000 行上对其进行了测试,每一行都在他的位置上,'rownum' 函数根本不会改变它们。
这是将 2 列彼此相邻放置的最佳和最快的方法,它们的行匹配,来自 2 个不同的表(在我的情况下也是 2 个不同的用户),这些表完全没有共同点可以加入。
即使我们屏蔽了数据,也应该有一些列包含两个表共有的数据。 请查看常见数据的主键列和标识列 - 一个建议。
我们可以根据您的要求根据使用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;
希望这可以帮助。 这应该可以解决问题。
您可以使用ROW_NUMBER() OVER (...)
OR 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 )
结果:
| 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 )
结果:
| ID1 | ID2 | DIFFERENCE |
|-----|-----|------------|
| 1 | 6 | 3 |
| 5 | 4 | 22 |
| 3 | 2 | -2 |
INNER JOIN
你的两个表,比如客户 ID 号。
必须有一些东西可以“加入”。 例如,假设两个表中的每一行都有一个 ClientID 列
SELECT table1.column1, table2.column1 FROM table1
INNER JOIN table2 ON table2.ClientID = table1.ClientID
不幸的是,你所要求的是不可能的。
简单地执行select * from table1
和select * from table2
并排不会像您期望的那样神奇地配对行。 这是因为您无法控制 Oracle 如何在内部选择存储行,或者如何将它们返回给您(除非您指定ORDER BY
子句)。 这甚至没有考虑到 Oracle 可以在更新值时按照它认为合适的方式移动行。
我的建议:重新开始你的屏蔽过程。 现在还不算晚,对吧? 您仍然拥有原始数据。
但是这一次,在你做之前,在table1
上添加一个名为Id
的新列。 它不需要有什么特殊的价值。 您可以使用序列自动生成它。 只需通过对其创建唯一约束来确保每一行的 Id 是唯一的,或者更好的是,将其定义为主键。
然后,当你屏蔽所有数据,并将其放置在table2
中,确保这个存储Id
值的相应行的table2
。
只有这样,您才能使用以下查询来完成您的要求:
select t1.*, t2.*
from t1
join t2 on t2.Id = t1.Id
没有办法解决这个问题。
编辑:
你要的是这个查询:
select t1.*, t2.*
from (select rownum as rn, t.* from table1 t) t1
join (select rownum as rn, t.* from table2 t) t2
on t2.rn = t1.rn
但是,我真的不明白您的行将如何神奇地与您期望的方式相匹配。 希望你会意识到这一点。 如果是这样,我强烈建议您考虑我上面的其他选项。
编辑2:
谈到 Oracle,我可能不是可靠的信息来源。 但汤姆·凯特是。 请阅读以下主题和他的回答。 我认为这将有助于您更好地理解问题:
https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:6257473400346237629
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.