在内部联接为true SQL-MS-ACCESS的条件下的左联接

在内部联接为true SQL-MS-ACCESS的条件下的左联接,sql,ms-access,Sql,Ms Access,在连接两个子查询(sub1和sub2)时,我有两种情况。案例1:sub2.fldvalue和sub2.fldvalue_覆盖中至少有一个NOTNULL值。在本例中,我希望保留sub1.Bloomb_分配的所有值,因此需要左连接。案例2:sub2.fldValue和sub2.fldValue_覆盖中的所有值都为空。在这种情况下,我不想保留sub1.Bloomb_分配的值,因此我需要一个内部联接: 查询结果案例1(isin='LU1956838830'): cln1 cln2 cln3 现金及其他

在连接两个子查询(sub1和sub2)时,我有两种情况。案例1:sub2.fldvalue和sub2.fldvalue_覆盖中至少有一个NOTNULL值。在本例中,我希望保留sub1.Bloomb_分配的所有值,因此需要左连接。案例2:sub2.fldValue和sub2.fldValue_覆盖中的所有值都为空。在这种情况下,我不想保留sub1.Bloomb_分配的值,因此我需要一个内部联接:

查询结果案例1(isin='LU1956838830'):

cln1 cln2 cln3 现金及其他 无效的 无效的 债券 无效的 无效的 衡平法 100 无效的 可供替代的 无效的 无效的 不适用 无效的 无效的
我认为您需要进行内部联接(仅返回两个子查询中匹配的行),而不是左联接(返回左子查询中的所有记录和右子查询中的匹配记录)。让我知道我是否正确

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
进行左联接sub1和sub2查询,则第二行的结果cln2值应为NULL,而不是“bond”

您也可以通过这种方式进行查询:

SELECT  sub1.BB_allocation AS cln1, 
        sub2.fldValue AS cln2, 
        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, sub2.fldValue, sub2.fldValue_Override, sub1.ordine
ORDER BY sub1.ordine;
您可以尝试以下方法来解决案例1和案例2:

首先,如果sub2有任何行,我在sub1和sub2查询之间进行并集,然后进行左连接以获得sub2的其余值,最后进行内部连接

如果sub2返回none行,则结果将为空。如果sub2返回至少一行,那么结果将是sub1和sub2之间的左连接

也许有更好的解决方案,但这是我的第一个解决方案

SELECT  sub1.BB_allocation AS cln1, 
        sub2.fldValue AS cln2, 
        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, sub2.fldValue, sub2.fldValue_Override, sub1.ordine
ORDER BY sub1.ordine;

为什么要更改列的名称?逻辑真的很难理解。你应该展示你想要的结果。“查询结果应该为空”是什么意思
NULL
是列中的值。您可以在cln2中的查询结果中找到NULL not Bond。也感谢您的替代查询。两个版本之间是否存在性能差异,我是否更喜欢其中一个版本?。关于主要问题,如果sub2.fldValue中至少有一个NOTNULL值,我想进行左连接,但是如果sub2.fldValue的所有值都为NULL,我需要进行内部连接。因此,如果sub2.fldValue的值都为NULL,我不想在cnl1中显示值。当您说“如果sub2.fldValue的值都为NULL,我需要内部连接”时,这意味着在查询sub2中,可以是一个包含blkName和fldValue NULL的行?我认为我的查询2具有更好的性能,因为它避免了子查询。因此您有两种情况:情况1(当至少有一个非NULL的sub2.fldValue值[您需要左连接](您的示例数据)。情况2(当所有sub2.fldValue值都为NULL[您需要内部连接])时。您可以将示例数据添加到情况2中吗(sub1和sub2查询示例数据和期望的结果)。我用您的指示更新了我的问题。ThanxI在我的回答中添加了一个可能的解决方案,请检查它并让我知道它是否有效。我不确定,因为我不知道您的表结构。
SELECT  sub1.BB_allocation AS cln1, 
        sub2.fldValue AS cln2, 
        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, sub2.fldValue, sub2.fldValue_Override, sub1.ordine
ORDER BY sub1.ordine;