繁体   English   中英

SQL Server 2005-3表难题

[英]SQL server 2005 - 3 table conundrum

在2000兼容模式下运行的SQL Server 2005。

我有三个表: BanksExceptionsClients 客户可以与任何银行进行交易,但exceptions表上与他有关的银行除外。 基本上,它们看起来像下面的“模式”:

Banks        Exceptions        Clients
-----        ----------        -------
bkID         bkID              
             clID              clID

我的问题是:我如何才能找到拥有最多2家允许与其交易的银行的所有客户(即不在“ Exceptions表上),而这两家银行之一是特定银行,对于所有客户来说总是一样的。

表述问题的另一种方式是:我如何找到拥有一个共同的特定银行的所有客户(我们可以选择JPM作为示例)以及最多一个可以与之交易的其他银行?

到目前为止,我已经创建了一个函数,该函数可以在给定clID计算可用的银行clID ,但是我真的无法弄清楚如何为所有至少具有JPM的客户添加这种条件...

谢谢大家!

PS:功能码

ALTER FUNCTION [dbo].[fnGetNbAvailableBanks](@clientID varchar(10))
RETURNS INTEGER
AS
BEGIN 
declare @intReturn integer

set @intReturn = (select 
                        count(*) numBanks
                    from 
                        Banks fxb
                        left outer join Exceptions bx
                            on bx.clID= @clientID and fxb.bkID = bx.bkID
                    where
                        bx.bkID is null
                        and isnull(fxb.bObsolete, 0) = 0)

RETURN @intReturn 
END

到目前为止我正在尝试运行的查询:

select *
from 
    (select
        clID,
        dbo.fnGetNbAvailableBanks(clID) cnt
    from
        Clients) t
where t.cnt <= 2

如您所见,我只会退回拥有<= 2个可用银行的客户); 我需要进一步筛选它们,使其包含在这两个可用银行中也包含JPM的那些银行,我想在寻找一个优雅的解决方案时问您。

这应该工作:

select clID from
(select distinct t1.bkID, t2.clID from Clients t1, Banks t2 
    where t2.bkID not in  
    (select  bkID from  Exceptions t3 where t1.clID = t3.clID ) ) as t1                         
  where clID  not in (select clID from Exceptions where bkID = %yourspecific bankid%)
  group by clID
  having count(*) <= 2

您可以使用哈希表,而不是选择括号中的语句,以使此查询更快地工作。

我将函数更改为使用EXISTS ,如下所示:

ALTER FUNCTION [dbo].[FNGETNBAVAILABLEBANKS](@clID VARCHAR(10)) 
returns INTEGER 
AS 
  BEGIN 
      DECLARE @intReturn INTEGER 
      SET @intReturn = (SELECT COUNT(*) numBanks 
                        FROM   (SELECT fxb.bkID 
                                FROM   Banks fxb 
                                       LEFT OUTER JOIN Exceptions bx 
                                                    ON bx.clID = @clID 
                                                       AND fxb.bkID = bx.bkID 
                                WHERE  bx.bkID IS NULL 
                                       AND ISNULL(fxb.bObsolete, 0) = 0 
                                       AND EXISTS (SELECT fxb.bkID 
                                                   FROM   Banks fxb 
                                                          LEFT OUTER JOIN 
                                                          Exceptions bx 
                                                                       ON bx.clID = @clID 
                                                                          AND fxb.bkID = bx.bkID 
                                                   WHERE  bx.bkID IS NULL 
                                                          AND fxb.bkID = 'JPM')) a) 
      RETURN @intReturn 
  END  

和这样的查询:

select *
from 
(select
    clID,
    dbo.fnGetNbAvailableBanks(clID) cnt
from
    Clients) t
where t.cnt <= 2 and t.cnt > 0

很抱歉缺少缩进,我不知道为什么它们不显示...我当然缩进了代码...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM