过去几天我在 Google 和 SO 上花了很多时间,但我似乎找不到我的问题的答案。不确切知道如何将问题表述为一个合理的问题会使其变得更加困难。你不知道你不知道什么,对吧?
由于业务限制,我无法发布我的确切代码和数据库结构,所以我会尽力给出一个可靠的例子。
客户表- 保存客户数据
[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 表- 如果客户有 ConditionCode,则不应包含的代码层次结构 (DropCode)
[ConditionCode] | [DropCode]
----------------------------
A               | B
B               | C
B               | D
现在我将尝试解释我的实际问题。
我想要完成的是编写一个查询(视图),它将根据 CodeHierarchy 表列出代码。
结果将是这样的:
[CustName] | [CodeId]
-------------------
John Smith | A
Jane Doe   | B
John Doe   | C
John Doe   | E
没有为 John Smith 列出代码 B,因为他有代码 A。没有为 Jane Doe 列出代码 C 和 D,因为她也有代码 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(即,即使没有 A,也不会返回带有 B 的客户行)
我有一个想法,将基本查询置于子查询之上,并将其与 CodeHierarchy 表连接起来,但我一直坚持如何编写查询:
SELECT
    *
FROM
    (
        base query (with all codes)
    ) CustomerCodesAll
        INNER/LEFT JOIN CodeHierarchy
            ON ?
我也一直在阅读 CTE,但我不确定如何使用该技术。
这最终将成为为了报告目的而被查询的视图。客户表包含更多数据,包括出生日期、性别、公司状态等。视图将很简单,可以提取所有内容。针对视图的查询将包括 dob、gender 等的 where 子句。
谁能指出我正确的方向?
谢谢你的帮助。