2013-04-24 42 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