Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么SQL在需要外部联接的地方进行内部联接_Sql_Join_Merge - Fatal编程技术网

为什么SQL在需要外部联接的地方进行内部联接

为什么SQL在需要外部联接的地方进行内部联接,sql,join,merge,Sql,Join,Merge,我有两个表,我想外部连接它们,然后使用SQL获取它们。确切的SQL查询是: 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 crsp.msf a FULL JOIN compa.fundq b ON (LEFT(a.cusip, 6)

我有两个表,我想外部连接它们,然后使用SQL获取它们。确切的SQL查询是:

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
    crsp.msf a 
FULL JOIN 
    compa.fundq b ON (LEFT(a.cusip, 6) = LEFT(b.cusip, 6) 
                  AND a.date = b.datadate)
WHERE 
    (b.datadate BETWEEN '2010-01-01' and '2015-12-31') 
    AND (a.date BETWEEN '2010-01-01' and '2015-12-31') 
    AND (b.cshoq > 0)
这将返回670'293行

但当我分别获取这两个数据集并通过R-merge将它们连接起来时,我得到了1'182'093行。我使用的两个独立查询是:

SELECT  
    LEFT(cusip, 6) AS cusip6, date, prc, ret, vol, spread, shrout 
FROM
    crsp.msf 
WHERE 
    date BETWEEN '2010-01-01' and '2015-12-31'

SELECT 
    LEFT(cusip, 6) AS cusip6, datadate AS date, epsf12, 
    (seqq-pstkq)/cshoq AS bps 
FROM
    compa.fundq 
WHERE 
    datadate BETWEEN '2010-01-01' and '2015-12-31' 
    AND cshoq > 0
然后我使用以下方法合并外部联接:

merge(x = data_1, y = data_2, by.x = c("cusip6", "date"), by.y = c("cusip6", "date"), all = T)
这将返回1'182'093行,这是正确的。因此,我最初的第一个SQL查询实际上是在显式指定外部联接时执行内部联接。下面的R-merge返回670'293行,重新验证从SQL中获取的数据是否确实是内部联接

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

我的SQL查询出了什么问题?

因为WHERE子句是在连接之后应用的。此时,由于“failed”联接,存在空值,并且这些行未通过WHERE子句

如果需要外部联接和筛选器,请将筛选器放入联接或子查询中

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

这是用于哪个RDBMS的?请添加一个标记,以指定您使用的是mysql、postgresql、sql server、oracle还是db2,或者完全使用其他内容。如果没有匹配的行,将如何填充a中的列?对于一个where子句,它对来自?