我加入了一家使用 SAS Enterprise Guide 的新公司。我有 2 个表,table A
有 100 行,并且table B
有超过 30M 行(50-60 列)。
我尝试从A
(100) 到B
(30M)进行正确连接,花了 2 个多小时,但没有结果。我想问一下,如果我做一个left join会有帮助吗?我使用了 GUI 并创建了以下查询。
30M 记录 <- 100 记录?
或者
100 条记录 -> 30M 条记录?
PROC SQL;
CREATE TABLE WORK.QUERY_FOR_CASE_NUMBER AS
SELECT t2.EMPGRPCOM,
t2.SEQINVNUM,
t2.SBSID,
t2.SBSLASTNAME,
t2.SBSFIRSTNAME,
t2.PMTDUEDATE,
t2.PREMAMT,
t2.ITEMDESC,
t2.EFFDATE,
t2.PAYAMT,
t2.MCAIDRATECD,
t2.REBILLIND,
t2.BILLTYPE
FROM WORK.'CASE NUMBER'n t1
LEFT JOIN DW.BILLING t2 ON (t1.CaseNumber = t2.SBSID)
WHERE t2.LOB = 'MD' AND t2.PMTDUEDATE BETWEEN '1Jan2015:0:0:0'dt AND '31Dec2017:0:0:0'dt AND t2.SITEID = '0001';
QUIT;
左连接和右连接,抛开所有其他事情,是等效的 - 如果你以相同的方式实现它们,无论如何。IE,
select a.*
from a
left join
b
on a.id=b.id
;
对比
select a.*
from b
right join
a
on b.id=a.id
;
相同的精确查询,没有区别,使用相同的时间。SQL 是一种解释型语言,这意味着 SQL 解释器会查看您发送的内容并找出最好的方法 - 因此它可以查看两个查询并知道在两种情况下都执行相同的操作。
您可以在各种文章中阅读有关此内容的内容,这是一个很好的起点,或者如果该链接已过期,只需搜索“右连接与左连接”即可。
现在,您可能要考虑以不同的方式编写它,即不使用 SQL;这种查询 SQL应该擅长,但有时出于某种原因不擅长。我会把它写成一个哈希表搜索,其中较小的 case_number 数据集被加载到内存中,然后数据步骤迭代较大的表并检查它是否在较小的数据集中找到 - 如果是,那么很好,返回它。
我还会考虑左/右连接是否是您想要的,与内部连接。在我看来,如果您只返回t2
值,则右/左连接不正确(当 t1 是“主要”时):您只会得到不匹配的空行。要么返回一个t1
变量,要么使用内连接。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句