我加入了一家使用SAS Enterprise Guide的新公司。 我有2个表,表A有100行,表B有超过30M行(50-60列)。
我尝试从A(100)到B(30M)进行正确的连接,花了2个多小时,没有结果回来。我想问一下,如果我做左联,会有帮助吗?我使用了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;
答案 0 :(得分:1)
左连接和右连接,除了所有其他的东西,都是等价的 - 如果你以相同的方式实现它们,无论如何。 I.E.,
select a.*
from a
left join
b
on a.id=b.id
;
VS
select a.*
from b
right join
a
on b.id=a.id
;
相同的查询,没有区别,同时使用。 SQL是一种解释型语言,这意味着SQL解释器会查看您发送的内容,并确定最佳方法是什么 - 所以它看到两个查询并且知道在两种情况下都做同样的事情。
你可以在各种文章中看到这一点,this one是一个很好的起点,或者如果该链接年龄只是搜索"右连接vs左连接"。
现在,可能想要考虑的是以不同的方式编写它,即不使用SQL;这种查询SQL 应该擅长但有时由于某种原因而不是。我会把它写成哈希表搜索,其中较小的case_number数据集被加载到内存中,然后数据步骤迭代更大的表并检查它是否在较小的数据集中找到 - 如果是,那么很好,返回它
我还考虑左/右连接是否是你想要的,而不是内连接。在我看来,如果您仅返回t2
个值,则右/左连接不正确(当t1为"主要"时):您只是得到不匹配的空行。要么返回t1
变量,要么使用内连接。