2016-10-17 41 views
1

我正在IBExpert中修改現有查詢。通常我們運行這個查詢,將結果導出到Excel,然後運行一個宏來創建一個新的字段 - 我試圖消除Excel中的這一步。使用SQL識別1對1記錄與多對多

我們有兩個來自不同表格的關鍵字段 - 讓我們稱它們爲來自Projects的ProjNo和來自Customers的CustNo--它們有多對多的關係。一個項目可以涉及多個客戶,並且一個客戶可以運行多個項目。他們之間有一個鏈接表來管理關係。

我們希望能夠識別這些值之間存在1:1的相關性,其中ProjNo只出現一次,而CustNo只出現一次。我已經摸索了很多嘗試將Case When語句放在一起,但我沒有太多運氣。這裏是我的最新嘗試:

(case when (select count(Proj.ProjNo) PCounts from Proj group by Proj.ProjNo)=1 and 
      (select count(Cust.CustNo) CCounts from Cust group by Cust.CustNo)=1 
     then "1:1" else "Multi" end) as Links 

我知道我需要包括某種形式的WHERE子句只檢查查詢的主體匹配PROJNO是值的,但我不知道如果我即使在正確的方向,或者我將如何將Case內部的SQL語句連接到主查詢。

幫助?

回答

1

這比它有任何權利要棘手。三表連接使我想要加入Cust和Link,然後加入Proj和Link,然後加入這些結果。它的訣竅是,一旦你加入了其中一個表對,你不必爲另一個對執行,只需將最後一個錶鏈接到鏈接對。這聽起來像我認爲編碼一樣令人困惑。

所以這裏是我想出的三路加入。

SELECT cnc.cust_tot, pn_link.CustNo, pn_link.ProjNo, pn_link.proj_tot 
FROM 
    (SELECT CustNo, Count(CustNo) as cust_tot 
    FROM Cust 
    GROUP BY CustNo) as cnc 
INNER JOIN 
    (SELECT a.CustNo, a.ProjNo, b.proj_tot 
    FROM 
    Link as a 
    INNER JOIN 
     (SELECT ProjNo, Count(ProgNo) as proj_tot 
     FROM Proj 
     GROUP BY ProjNo) as b 
    ON a.ProjNo = b.ProjNo) as pn_link 
ON cnc.CustNo = pn_link.CustNo 
WHERE cnc.cust_tot = 1 
and pn_link.proj_tot = 1 

最後,我有WHERE聲明只抓取一對一的匹配。要獲得多場比賽只是將其更改爲

WHERE cnc.cust_tot > 1 
or pn_link.proj_tot > 1 

然後,您可以UNION兩個查詢得到這一切在一個表一次。呼。

+0

非常感謝!我需要做一些修改以適應它,但看起來應該讓我得到我需要的東西。 – Werrf