我在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