用于组合来自2个不相关的表

时间:2015-06-22 12:41:05

标签: sql database oracle relational-database database-schema

我一直在互联网上寻找解决此问题的方法,但似乎没有人在之前提出这个问题。

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个不相关的表中放在一起:我的工作是去银行,拿走他们的数据库与客户'信息,并掩盖所有数据(以某种方式,而不是随机)。 最后,我有银行的原始表及其完美克隆 - 克隆表由掩码数据填充。 在那时,关键部分开始了:

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

为了确保所有数据都已正确屏蔽,遵守客户(银行)的所有标准,我需要将第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个不同的用户),他们绝对没有加入时常见。

5 个答案:

答案 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 table1select * 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)

指定

SQL Fiddle

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 |