首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >完全外连接的顺序会产生不同数量的结果Rows..Why?

完全外连接的顺序会产生不同数量的结果Rows..Why?
EN

Stack Overflow用户
提问于 2014-10-22 23:33:33
回答 1查看 59关注 0票数 3

我正在使用两个表AB。表A标识了股权证券,表B有许多关于证券的详细信息。

例如,当为B.Item = 5301时,该行指定给定证券的价格。当为B.Item = 9999时,该行指定给定证券的股息。我正试图同时获得价格和股息。为了实现这一点,我对表A执行了两次FULL JOINed B

代码语言:javascript
运行
复制
SELECT * 
FROM   a a 
       FULL JOIN (SELECT * 
                  FROM   b) b 
              ON b.code = a.code 
                 AND b.item = 3501 
       FULL JOIN (SELECT * 
                  FROM   b) b2 
              ON b2.code = a.code 
                 AND b.item = 9999 
                 AND b2.year_ = b.year_ 
                 AND b.freq = b2.freq 
                 AND b2.seq = b.seq 
WHERE  a.code IN ( 122514 ) 

join子句中的其余字段,如Year_FreqSeq,只需确保价格和分红的日期匹配即可。A.Code只是标识单个安全性。

我的问题是,当我颠倒完整连接的顺序时,我会得到不同数量的结果。因此,如果b.Item = 9999出现在b.Item 2501之前,我会得到一个结果。反过来,我得到了2个结果。我意识到表B中没有用于红利的安全122514条目,但是有两个用于价格的条目。

当首先指定价格时,我得到的价格和红利字段都是null。但是,如果首先指定了first,那么对于first字段,我会得到NULLs,对于价格字段,我也会得到nulls

为什么两个价格条目没有显示出来?我希望他们在FULL JOIN中这样做。

EN

回答 1

Stack Overflow用户

发布于 2014-10-22 23:54:17

这是因为您的第二个完全外部联接引用了您的第一个完全外部联接。这意味着改变它们的顺序将从根本上改变查询。

下面是一些伪SQL,演示了它是如何工作的:

代码语言:javascript
运行
复制
DECLARE @a TABLE (Id INT, Name VARCHAR(50));
INSERT INTO @a VALUES (1, 'Dog Trades');
INSERT INTO @a VALUES (2, 'Cat Trades');
DECLARE @b TABLE (Id INT, ItemCode VARCHAR(1), PriceDate DATE, Price INT, DividendDate DATE, Dividend INT);
INSERT INTO @b VALUES (1, 'p', '20141001', 100, '20140101', 1000);
INSERT INTO @b VALUES (1, 'p', '20141002', 50, NULL, NULL);
INSERT INTO @b VALUES (2, 'c', '20141001', 10, '20141001', 500);
INSERT INTO @b VALUES (2, 'c', NULL, NULL, '20141002', 300);

--Same results
SELECT a.*, b1.*, b2.* FROM @a a FULL OUTER JOIN @b b1 ON b1.Id = a.Id AND b1.ItemCode = 'p' FULL OUTER JOIN @b b2 ON b2.Id = a.Id AND b2.ItemCode = 'c';
SELECT a.*, b2.*, b1.* FROM @a a FULL OUTER JOIN @b b1 ON b1.Id = a.Id AND b1.ItemCode = 'c' FULL OUTER JOIN @b b2 ON b2.Id = a.Id AND b2.ItemCode = 'p';

--Different results
SELECT a.*, b1.*, b2.* FROM @a a FULL OUTER JOIN @b b1 ON b1.Id = a.Id AND b1.ItemCode = 'p' FULL OUTER JOIN @b b2 ON b2.Id = a.Id AND b2.ItemCode = 'c' AND b2.DividendDate = b1.PriceDate;
SELECT a.*, b2.*, b1.* FROM @a a FULL OUTER JOIN @b b1 ON b1.Id = a.Id AND b1.ItemCode = 'c' FULL OUTER JOIN @b b2 ON b2.Id = a.Id AND b2.ItemCode = 'p' AND b2.DividendDate = b1.PriceDate;
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26511327

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档