Sql 外部连接不工作

Sql 外部连接不工作,sql,sql-server,outer-join,Sql,Sql Server,Outer Join,我原以为不用CTE我也能做到,但我并没有得到我所期望的全部结果。我应该从AssnCtrl中获得6行,但是当没有与我的@MngrKey匹配的记录时,我没有得到任何记录。这是我的疑问。。。我做错了什么 提前感谢您的帮助 ALTER PROCEDURE usp_Manager_GetAssociations @ClientKey int, @MgmtKey int, @MngrKey int AS BEGIN SELECT COALESCE(m.Mn

我原以为不用CTE我也能做到,但我并没有得到我所期望的全部结果。我应该从
AssnCtrl
中获得6行,但是当没有与我的
@MngrKey
匹配的记录时,我没有得到任何记录。这是我的疑问。。。我做错了什么

提前感谢您的帮助

ALTER PROCEDURE usp_Manager_GetAssociations

@ClientKey      int,
@MgmtKey        int,
@MngrKey        int

AS
BEGIN

    SELECT COALESCE(m.MngrKey, 0) AS MngrKey,
        a.pKey AS AssnKey,
        a.Name

    FROM ManagerAssociations m
        RIGHT OUTER JOIN AssnCtrl a
        ON a.ClientKey = m.ClientKey
        AND a.MgmtKey = m.MgmtKey
        AND a.pKey = m.AssnKey

    WHERE a.ClientKey = @ClientKey
        AND a.MgmtKey = @MgmtKey
        AND (m.MngrKey = @MngrKey OR m.MngrKey IS NULL)
        AND a.Active = 1
更新:很抱歉周五没有提供更多信息-我正试图离开办公室!这是MS SQL Server 2008

基本上,我在AssnCtrl中采用了一个平面结构,其中包括5列(MngrKey1-MngrKkey5),用于将管理器(MngrKey)分配给关联,并对其进行规范化,因此我现在有了交叉实体ManagerAssociations,以将n个管理器映射到AssnCtrl表。MgmtKey字段是关联所属管理公司的密钥,每个关联最多可以关联n个mngrkey

如果经理负责关联,我会在ManagerAssociations表中映射该关系。这是一个复选框列表(ASP.NET)。当您转到.NET系统中每个经理的页面时,我想要一个属于该管理公司(MgmtKey)的所有关联的列表,以便用户可以检查此经理有权访问哪些关联

当前,如果我使用以下参数运行存储过程: usp_经理_协会33432、106、164 我得到这个结果:

MngrKey   AssnKey    Name
0            6805   Camino Del Quinta Homeowners Association, Inc.
0            6695   Sanctuary Pines in Boca Raton Condominium Association, Inc.
0            6693   Vallhala Village Condominium Association, Inc.
但我知道这家管理公司有6个协会:

从AssnCtrl中选择*其中mgmtkey=106 收益率:

目前,另一名经理(MngrKey 163)被分配到该管理公司旗下的三个协会。从managerassociations运行select*,其中mgmtkey=106产生:

pkey ClientKey MgmtKey AssnKey MngrKey
873 33432   106          383             163
28  33432   106          372             163
871 33432   106          369             163
这让我相信JoeT已经掌握了一些东西。似乎我正在抓取在ManagerAssociations中至少有一个经理分配的所有关联,但我需要一个完整的关联列表,无论他们的经理分配如何,如果经理分配在ManagerAssociations表中,我将向proc提供经理的pkey

抱歉-我知道这让人困惑,但希望这会有所帮助

决议:只是做了一个联盟。它可以工作,虽然要付出一定的性能代价,但它能满足我的需要

SELECT ma.MngrKey, a.pKey, a.Name
    FROM ManagerAssociations ma INNER JOIN AssnCtrl a
    ON ma.ClientKey = a.ClientKey
        AND ma.MgmtKey = a.MgmtKey
        AND ma.AssnKey = a.pKey
    WHERE ma.ClientKey = @ClientKey
        AND ma.MgmtKey = @MgmtKey
        AND ma.MngrKey = @MngrKey

UNION

    SELECT 0, pKey, Name
    FROM AssnCtrl
    WHERE ClientKey = @ClientKey
        AND MgmtKey = @MgmtKey
        AND pKey NOT IN
        (SELECT AssnKey 
        FROM ManagerAssociations a
        WHERE ClientKey = @ClientKey
            AND MgmtKey = @MgmtKey
            AND MngrKey = @MngrKey)

是否存在ManagerAssociations.MngrKey不为NULL且不等于@MngrKey的情况?如果是这样,则此“WHERE”行与以下内容不匹配:
和(m.MngrKey=@MngrKey或m.MngrKey为NULL)
可能是ManagerAssociations。MngrKey的默认值为非NULL,根据提供的信息无法确定,但这将导致它永远不匹配。请创建一个SQL Fiddle示例
SELECT ma.MngrKey, a.pKey, a.Name
    FROM ManagerAssociations ma INNER JOIN AssnCtrl a
    ON ma.ClientKey = a.ClientKey
        AND ma.MgmtKey = a.MgmtKey
        AND ma.AssnKey = a.pKey
    WHERE ma.ClientKey = @ClientKey
        AND ma.MgmtKey = @MgmtKey
        AND ma.MngrKey = @MngrKey

UNION

    SELECT 0, pKey, Name
    FROM AssnCtrl
    WHERE ClientKey = @ClientKey
        AND MgmtKey = @MgmtKey
        AND pKey NOT IN
        (SELECT AssnKey 
        FROM ManagerAssociations a
        WHERE ClientKey = @ClientKey
            AND MgmtKey = @MgmtKey
            AND MngrKey = @MngrKey)