2016-10-27 44 views
-1

我有些时候SQL而来的,是新手的另一个表中添加列,因此需要帮助,我的问题如下(我已经尝试更新,但它是很慢)查询在一个快速的方式

我有一个表A(具有6.5密耳记录),我想用表B(具有2.5mil记录)的值向列中添加一列(Y),其中列(条件)列X AX = BX

B不干没有A的所有X值。

此外,X不唯一的值,但是用于Y的重复值,X也重复值

含义绝不会有的情况下,X = 10,Y = 5,X = 10,Y = 15(Y会有重复的值以及)

更多相关信息,相关 我不需要从Y添加的所有值仅在AX < 0(和AX = BX)

回答

0
  1. 写一个实际SELECT将返回您在中需要的内容表。关于重复项,您可以执行“select distinct”以从输出中删除 重复项。
  2. 创建一个视图基于您选择 写道。如果您只需“分享 选择”,则不必创建TABLE,那么您可能会更高效地为您提供更有效的视图,并使 更加灵活。
0

我想你试过这样的事情

alter table A add(Y NUMBER); 

update A set Y = (select distinct Y from B where A.X = B.X) 
where A.X < 0; 

这是最简单的情况..和“慢”是相对的10millions行心不是小。但是也许你需要B.X上的索引来防止全表扫描。如果需要可以稍后再移除。

+0

你是不是想要从B(不是X)中选择Y?而且你似乎错过了只有在A.X <0时才进行更新的部分。 – mathguy

+0

可能..现在更新这个答案来反映这一点。 – ShoeLace

0

首先将y列添加到表a(也许您已经做过)。

然后,当您使用另一个(“源”)表中的数据更新目标表时,merge语句通常优于update。它更容易阅读和理解(并因此保持),它更加灵活 - 您可以在一个语句中进行更新,插入和删除所有语句,有时它可能比(并且从不比它慢)update和其他陈述取代。

事情是这样的:

merge into a 
    using (select distinct x, y from b where x < 0) g 
    on (a.x = g.x) 
when matched then update 
    set a.y = g.y 

注意,其他人已经指出的那样,你必须select distinct在一个子查询g第一;您无法直接从表b更新。