我以为我可以在没有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个MngrKeys与每个关联关联。
如果经理负责关联,我会在ManagerAssociations表中映射该关系。这是一个复选框列表(ASP.NET)。当您转到.NET系统中每个经理的页面时,我想要一个属于该管理公司(MgmtKey)的所有关联的列表,以便用户可以检查该经理可以访问的关联。
目前,如果我使用以下参数运行存储过程: usp_Manager_GetAssociations 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 产率:
ClientKey MgmtKey AssnKey Name
33432 106 369 Mariners Way Association, Inc.
33432 106 372 Ocean Cay Community Association
33432 106 383 Sierra Palms Homeowners' Association, Inc.
33432 106 6693 Vallhala Village Condominium Association, Inc.
33432 106 6695 Sanctuary Pines in Boca Raton Condominium Association, Inc.
33432 106 6805 Camino Del Quinta Homeowners Association, Inc.
目前有另一名经理(MngrKey 163)被分配到该管理公司下的三个协会。运行select * from managerassociations 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表中分配。
抱歉 - 我知道这很令人困惑,但希望这会有所帮助!
决议:改为联盟。尽管有一些性能成本,它仍然有效,但它让我得到了我需要的东西。
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)