繁体   English   中英

SQL 组合来自 2 个不相关表的 2 个不相关列

[英]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 个不相关的列放在一起:我的工作是去银行,用客户的信息获取他们的数据库,并屏蔽所有数据(以某种方式,不是随机的)。 最后,我得到了银行的原始表及其完美克隆 - 由屏蔽数据填充的克隆表。 在这一点上,关键部分开始了:

  • 我需要做的是逐列比较:银行原始表中的 1 列与其克隆 - 相同的列,但其中包含屏蔽数据而不是原始数据(实际上是一个全新的列)一个全新的表)。

为了确保所有数据都被正确屏蔽,尊重客户(银行)的所有标准,我需要将 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)指定它。

SQL小提琴

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 table1select * 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM