微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在内部联接为真 SQL-MS-ACCESS

如何解决在内部联接为真 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

如何编写查询获取案例 2 的结果,例如:

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 举报,一经查实,本站将立刻删除。