2016-11-07 59 views
4

我需要一个样品后,我做两个表的连接后,是这样的:做一个连接两个表具有采样他们

SELECT * 
from 
A left join B 
on A.col=B.col 
sample 1000000 

的问题是,A和B是巨大(超过3十亿行),当我尝试连接时,我的spool空间用完了。

是否有办法在样本之后进行连接,以便连接更小的表(例如,从A和B中选择10,000,000个样本,内部连接它们,并从连接中选择1,000,000个样本,希望我可以获得至少1,000,000行?)

PS 我使用Teradata的

+1

(1)A和B之间的关系是什么? 1:1? 1:N? (2)A和B的主要指标是什么? –

+0

你可以抽样1000000到一个临时表SELECT * INTO #A从一个样本1000000然后选择*从#A左加入B A.Col = B.col – Cato

+0

你已经很好的答案在这里,但如果你回答@Dudu -Markovitz的问题你会让答案得到改善。 – Insac

回答

0

你可以尝试使用加入到SAMPLE限制大小子查询:其次

SELECT * FROM #A left join B on #A.Col = B.col; 

我铭记

SELECT * 
FROM 
(SELECT * FROM A SAMPLE 1000) t1 
LEFT JOIN 
(SELECT * FROM B SAMPLE 1000) t2 
    ON t1.col = t2.col 
+1

(1)PO使用LEFT JOIN(2)统计此查询将不返回任何行 –

+0

编辑后,@DuduMarkovitz注释的点(2)是否仍然有效?你从A(超过30亿行)和1000从B中随机抽取1000行。你会发现一些匹配的机会(即使B与A是1:1)看起来很渺茫。 – Insac

+0

@Insac为什么匹配连接的_probability_会随着样本数量的减少而下降?它不应该。因此,如果大多数记录在完全加入中不匹配,那么在我的回答中,大多数记录也不匹配。这个想法是让样本代表原始数据问题。 –

0
SELECT * INTO #A FROM A SAMPLE 1000000; 

,在原来的查询,你似乎要求任何1000000的A,然后将LEFT JOIN加入B,如果没有匹配,则返回NULL;如果不匹配,则返回NULL - 我假设它是1-1或1- 0也加入 - 否则它不符合你的本意

+0

SQL Server语法,Teradata问题。 –

+0

@DuduMarkovitz - 我有点猜测他可能有什么样的语法 – Cato

+0

在这种情况下更好地使用伪代码。 '#'作为临时表的指示特定于SQL Server。在CTAS上下文中的“INTO”也特定于SQL Server。 –

0
SELECT * 
from 
(select * from A sample 1000000) A left join B 
on A.col=B.col 
+0

请停止评论我的答案,谢谢。 –

1

你可以做你建议,应用SAMPLE在派生表:

对于内
SELECT * 
from 
(
    SELECT * FROM A 
    SAMPLE 10000000 
) AS A 
left join B 
on A.col=B.col 

类似的加入

SELECT * 
from 
(
    SELECT * FROM A 
    SAMPLE 100000000 -- larger sample than needed 
) AS A 
join B 
on A.col=B.col 
sample 10000000