簡體   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