1

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

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

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

我的问题是:我怎样才能找到最多有 2 家银行允许他们交易(即不在Exceptions桌面上)的所有客户,并且这两家银行中的一家是特定的,对所有客户总是相同的。

改写问题的另一种方式是:我如何找到所有拥有一家特定银行(我们可以选择JPM作为示例)且最多允许与另一家银行进行交易的客户?

到目前为止,我已经创建了一个函数来计算给定 a 有多少银行可用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 个可用银行的客户);我需要将它们进一步过滤到这 2 家可用银行中也包含 JPM 的那些银行,我在问你,因为我正在寻找一个优雅的解决方案。

4

2 回答 2

1

这应该有效:

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

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

于 2013-05-10T09:53:00.903 回答
0

我将函数更改为 use 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

抱歉没有缩进,我不知道为什么他们没有出现......我当然缩进了代码......

于 2013-05-10T10:01:42.290 回答