为什么SQL在需要外连接的内部连接中进行

时间:2017-12-25 21:01:50

标签: sql join merge

我有两张桌子,我想要"外面"使用SQL连接(然后获取)。确切的SQL查询(有问题)是:

merge(x = data_1, y = data_2, by.x = c("cusip6", "date"), by.y = c("cusip6", "date"), all = T)

这会返回670&293行。

但是当我分别获取两个数据集并且(外部)通过R-merge()连接它们时,我得到1' 182&0 3993行。我使用的两个单独的查询是:

merge(x = data_1, y = data_2, by.x = c("cusip6", "date"), by.y = c("cusip6", "date"))

然后我使用:

合并(外连接)
SELECT 
     p.userid, 
     p.firstname, 
     p.lastname, 
     p.email 
FROM 
     people as p, 
     employee as emp 
WHERE 
     p.userid = emp.userid

这会返回1' 182&0 3993行,这是正确的。所以我原来的(第一个)SQL查询实际上正在执行一个"内部连接"当我明确指定外连接时。下面的R-merge()返回670和293行,重新验证从SQL获取的数据确实是一个内连接。

PUT http://localhost:9200/indexname

{
  "mappings": {
     "typename": {
        "properties": {
           "products" : {
              "type" : "nested"
            }
          }
       }
    }
 }

我的SQL查询出错了什么?

1 个答案:

答案 0 :(得分:1)

因为在JOIN之后应用了WHERE子句。此时有NULL值(由于'失败' JOINs),这些行无法通过WHERE子句。

如果您想要一个OUTER JOIN和一个过滤器,请将过滤器放在JOIN或子查询中。

SELECT
    LEFT(a.cusip, 6) AS cusip6, 
    a.date, a.prc, a.ret, a.vol, a.spread, a.shrout,
    b.epsf12, (b.seqq-b.pstkq) / b.cshoq AS bps
FROM
    (SELECT * FROM crsp.msf WHERE date BETWEEN '2010-01-01' and '2015-12-31') a
FULL JOIN 
    (SELECT * FROM compa.fundq WHERE datadate BETWEEN '2010-01-01' and '2015-12-31' AND cshoq > 0) b
        ON  LEFT(a.cusip, 6) = LEFT(b.cusip, 6) 
        AND a.date = b.datadate