如何解决在内部联接为真 SQL-MS-ACCESS
在加入两个子查询(sub1 和 sub2)时,我有两种情况。案例1:sub2.fldvalue 和sub2.fldvalue _Override 中至少有一个非空值。在这种情况下,我想保留 sub1.Bloomb_Allocation 的所有值,所以我需要 LEFT JOIN。案例2:sub2.fldValue 和sub2.fldValue_Override 中的所有值都为空。在这种情况下,我不想保留 sub1.Bloomb_Allocation 的值,所以我需要一个 INNER JOIN。 :
查询结果CASE 1(isin='LU1956838830'):
SELECT sub1.BB_allocation AS cln1,sub2.fldValue AS cln2,sub2.fldValue_Override AS cln3
FROM(
(SELECT Bloomb_Allocation,BB_allocation,ordine FROM dbBloomFields WHERE Bloomb_Blk='Asset Type') AS sub1
Left Join
(SELECT blkName,fldValue,fldValue_Override FROM dbSecurityMacroAllocation WHERE isin= 'LU1956838830') AS sub2
ON sub1.BB_Allocation=sub2.blkName)
GROUP BY sub1.BB_allocation,sub2.fldValue,sub2.fldValue_Override,sub1.ordine
ORDER BY sub1.ordine
cln1 | cln2 | cln3 |
---|---|---|
现金及其他 | NULL | NULL |
绑定 | NULL | NULL |
股权 | 100 | NULL |
替代 | NULL | NULL |
n/c | NULL | NULL |
与: 子1:
Bloom_Allocation | BB_allocation | 顺序 |
---|---|---|
替代 | 替代 | 4 |
绑定 | 绑定 | 2 |
现金及其他 | 现金及其他 | 1 |
股权 | 股权 | 3 |
MoneyMarket | 现金及其他 | 1 |
n/c | n/c | 5 |
sub2
blkName | fldValue | fldValue_Override |
---|---|---|
股权 | 100 | 空 |
查询结果CASE 2(Keeping LEFT JOIN with isin='abcd123456',表中不存在dbSecurityMacroAllocation):
SELECT sub1.BB_allocation AS cln1,fldValue_Override FROM dbSecurityMacroAllocation WHERE isin= 'abcd123456') AS sub2
ON sub1.BB_Allocation=sub2.blkName)
GROUP BY sub1.BB_allocation,sub1.ordine
ORDER BY sub1.ordine
cln1 | cln2 | cln3 |
---|---|---|
现金及其他 | NULL | NULL |
绑定 | NULL | NULL |
股权 | NULL | NULL |
替代 | NULL | NULL |
n/c | NULL | NULL |
与: 子1:
Bloom_Allocation | BB_allocation | 顺序 |
---|---|---|
替代 | 替代 | 4 |
绑定 | 绑定 | 2 |
现金及其他 | 现金及其他 | 1 |
股权 | 股权 | 3 |
MoneyMarket | 现金及其他 | 1 |
n/c | n/c | 5 |
sub2
blkName | fldValue | fldValue_Override |
---|---|---|
NULL | NULL | 空 |
cln1 | cln2 | cln3 |
---|---|---|
NULL | NULL | NULL |
解决方法
我认为您想要进行 INNER JOIN(仅返回在两个子查询中匹配的行),而不是 LEFT JOIN(返回来自左子查询的所有记录和来自右子查询的匹配记录)。让我知道我是否正确。
SELECT sub1.BB_allocation AS cln1,sub2.fldValue AS cln2,sub2.fldValue_Override AS cln3
FROM (SELECT Bloomb_Allocation,BB_allocation,ordine FROM dbBloomFields WHERE Bloomb_Blk='Asset Type') AS sub1
INNER JOIN (SELECT blkName,fldValue,fldValue_Override FROM dbSecurityMacroAllocation WHERE isin= 'LU1956838830') AS sub2 ON sub1.BB_Allocation = sub2.blkName
GROUP BY sub1.BB_allocation,sub2.fldValue,sub2.fldValue_Override,sub1.ordine
ORDER BY sub1.ordine;
您的查询结果是错误的,因为如果您通过 sub1.BB_Allocation = sub2.blkName
进行 LEFT JOIN sub1 和 sub2 查询,则第二行的结果 cln2 值应为 NULL,而不是“bond”。
你也可以这样查询:
SELECT sub1.BB_allocation AS cln1,sub2.fldValue_Override AS cln3
FROM dbBloomFields AS sub1
INNER JOIN dbSecurityMacroAllocation AS sub2 ON sub1.BB_Allocation = sub2.blkName
WHERE sub1.Bloomb_Blk = 'Asset Type' AND sub2.isin = 'LU1956838830'
GROUP BY sub1.BB_allocation,sub1.ordine
ORDER BY sub1.ordine;
您可以尝试这样的方法来解决案例 1 和案例 2:
首先,如果 sub2 有任何行,我在 sub1 和 sub2 查询之间创建 UNION,然后我进行左连接以获得 sub2 的其余值,最后我进行 INNER JOIN。
如果 sub2 没有返回任何行,那么结果将为空。如果 sub2 至少返回一行,那么结果将是 sub1 和 sub2 之间的左连接。
也许有更好的解决方案,但这是我的第一个解决方案。
SELECT sub1.BB_allocation AS cln1,sub2.fldValue_Override AS cln3
FROM dbBloomFields AS sub1
INNER JOIN (
SELECT u1.blkName,lj1.fldValue,lj1.fldValue_Override
FROM (
SELECT CASE WHEN (SELECT COUNT(blkName) > 0 FROM dbSecurityMacroAllocation WHERE isin = 'LU1956838830') THEN BB_allocation ELSE NULL END AS blkName
FROM dbBloomFields WHERE Bloomb_Blk='Asset Type'
UNION
SELECT blkName FROM dbSecurityMacroAllocation WHERE isin = 'LU1956838830' ) AS u1
LEFT JOIN dbSecurityMacroAllocation AS lj1 ON u1.blkName = lj1.blkName) sub2 ON sub1.BB_Allocation = sub2.blkName
WHERE sub1.Bloomb_Blk = 'Asset Type'
GROUP BY sub1.BB_allocation,sub1.ordine
ORDER BY sub1.ordine;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。