我在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,性別等的子句。
任何人都可以指向正確的方向嗎?
感謝您的任何幫助。
工作就像一個魅力。我想我太過於複雜了。謝謝! – 2013-04-24 20:36:37