SAS Enterprise:左连接和右连接差异?

时间:2017-05-23 15:59:31

标签: sql sas

我加入了一家使用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;

1 个答案:

答案 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变量,要么使用内连接。