Sql 外部连接不工作
我原以为不用CTE我也能做到,但我并没有得到我所期望的全部结果。我应该从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
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)