2013-04-24 52 views
2

我在Google和最近幾天都花了不少時間,但是我似乎無法找到解決我的問題的答案。不確切地知道如何將問題描述成合理的問題會使問題變得更加困難。你不知道你不知道,對吧?構建一個不包含基於層次數據的SQL查詢

由於業務限制,我無法發佈我的確切代碼和數據庫結構,所以我會盡我所能給出一個堅實的例子。

客戶表 - 保存客戶數據

[CustId] | [CustName] 
--------------------- 
1  | John Smith 
2  | Jane Doe 
3  | John Doe 

碼錶 - 保存代碼數據

[CodeId] | [CodeDesc] 
--------------------- 
A  | A Desc 
B  | B Desc 
C  | C Desc 
D  | D Desc 
E  | E Desc 

CustomerCode表 - 結合客戶代碼

[CustId] | [CodeId] 
------------------- 
1  | A 
1  | B 
2  | B 
2  | C 
2  | D 
3  | C 
3  | E 

CodeHierarchy表 - 代碼的層次不應包括(DropCode)如果客戶有一個ConditionCode

[ConditionCode] | [DropCode] 
---------------------------- 
A    | B 
B    | C 
B    | D 

現在,我會盡力解釋我的實際問題。

我想完成的是寫一個查詢(視圖),它將列出基於CodeHierarchy表的代碼。

結果會是這樣的:

[CustName] | [CodeId] 
------------------- 
John Smith | A 
Jane Doe | B 
John Doe | C 
John Doe | E 

代碼B未列出的約翰·史密斯,因爲他有代碼A.代碼C和d,沒有列出Jane Doe的,因爲她也有代碼B 。John Doe列出了所有代碼(注意,E甚至不在CodeHierarchy表中)。我試過幾個不同的東西(內部連接,左/右連接,子查詢等),但我無法得到我要找的結果。

爲基地的查詢,這將返回所有代碼:

SELECT 
    Customer.CustomerName, 
    Code.CodeDesc 
FROM 
    Customer 
     INNER JOIN CustomerCode 
      ON Customer.CodeId = CustomerCode.CodeId 
     INNER JOIN Code 
      ON CustomerCode.CodeId = Code.CodeId 

是ConditionCodes這隻能返回代碼(我明白爲什麼,但我雖然它可能是值得的時候一拍):

SELECT 
    Customer.CustomerName, 
    Code.CodeDesc 
FROM 
    Customer 
     INNER JOIN CustomerCode 
      ON Customer.CodeId = CustomerCode.CodeId 
     INNER JOIN Code 
      ON CustomerCode.CodeId = Code.CodeId 
     INNER JOIN CodeHierarchy 
      ON Customer.CodeId = CodeHierarchy.ConditionCode 
      AND Customer.CodeId != CodeHierarchy.DropCode 

我試過了一個子查詢(沒有可用的代碼),最終刪除了所有DropCodes,無論成員是否有合格的層次結構(即,即使他們沒有返回也沒有返回B的客戶行沒有A)

我有做一個子查詢上面的基本查詢的想法,並與CodeHierarchy表中加入它,但我卡在如何編寫查詢:

SELECT 
    * 
FROM 
    (
     base query (with all codes) 
    ) CustomerCodesAll 
     INNER/LEFT JOIN CodeHierarchy 
      ON ? 

我也一直在做一些閱讀在CTE上,但我不確定我如何使用這種技術。

這將最終成爲一種查看報告的目的。顧客表格包含更多的數據,包括dob,性別,公司狀態等。視圖將很簡單,並且可以拉取所有內容。針對該視圖的查詢將包括dob,性別等的子句。

任何人都可以指向正確的方向嗎?

感謝您的任何幫助。

回答

3
SELECT 
    Customer.CustName, 
    Code.CodeDesc 
FROM 
    Customer 
     INNER JOIN CustomerCode AS posCustomerCode 
      ON Customer.CustId = posCustomerCode.CustId 
     INNER JOIN Code 
      ON posCustomerCode.CodeId = Code.CodeId 
     LEFT JOIN CodeHierarchy 
      ON posCustomerCode.CodeId = CodeHierarchy.DropCode 

WHERE 
    CodeHierarchy.ConditionCode NOT IN (
     SELECT CodeId 
     FROM CustomerCode AS negCustomerCode 
     WHERE negCustomerCode.CustId=posCustomerCode.CustId 
    ) 
    OR CodeHierarchy.ConditionCode IS NULL 

SQLfiddle

+0

工作就像一個魅力。我想我太過於複雜了。謝謝! – 2013-04-24 20:36:37