我正在使用两个表A
和B
。表A
标识了股权证券,表B
有许多关于证券的详细信息。
例如,当为B.Item = 5301
时,该行指定给定证券的价格。当为B.Item = 9999
时,该行指定给定证券的股息。我正试图同时获得价格和股息。为了实现这一点,我对表A
执行了两次FULL JOINed
B
。
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_
、Freq
和Seq
,只需确保价格和分红的日期匹配即可。A.Code
只是标识单个安全性。
我的问题是,当我颠倒完整连接的顺序时,我会得到不同数量的结果。因此,如果b.Item = 9999
出现在b.Item 2501
之前,我会得到一个结果。反过来,我得到了2个结果。我意识到表B
中没有用于红利的安全122514
条目,但是有两个用于价格的条目。
当首先指定价格时,我得到的价格和红利字段都是null
。但是,如果首先指定了first,那么对于first字段,我会得到NULLs
,对于价格字段,我也会得到nulls
。
为什么两个价格条目没有显示出来?我希望他们在FULL JOIN
中这样做。
发布于 2014-10-22 23:54:17
这是因为您的第二个完全外部联接引用了您的第一个完全外部联接。这意味着改变它们的顺序将从根本上改变查询。
下面是一些伪SQL,演示了它是如何工作的:
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;
https://stackoverflow.com/questions/26511327
复制相似问题