Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 构建一个不使用';不包括基于层次结构的数据_Sql_Sql Server_Sql Server 2008 R2 - Fatal编程技术网

Sql 构建一个不使用';不包括基于层次结构的数据

Sql 构建一个不使用';不包括基于层次结构的数据,sql,sql-server,sql-server-2008-r2,Sql,Sql Server,Sql Server 2008 R2,在过去的几天里,我花了相当多的时间在谷歌上,但我似乎找不到问题的答案。不知道如何将问题表达成合理的问题会使问题变得更加困难。你不知道你不知道的,对吗 由于业务限制,我无法发布确切的代码和数据库结构,因此我将尽力给出一个可靠的示例 客户表-保存客户数据 [CustId] | [CustName] --------------------- 1 | John Smith 2 | Jane Doe 3 | John Doe 代码表-保存代码数据 [C

在过去的几天里,我花了相当多的时间在谷歌上,但我似乎找不到问题的答案。不知道如何将问题表达成合理的问题会使问题变得更加困难。你不知道你不知道的,对吗

由于业务限制,我无法发布确切的代码和数据库结构,因此我将尽力给出一个可靠的示例

客户表-保存客户数据

[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
客户代码表-将客户与代码结合起来

[CustId] | [CodeId]
-------------------
1        | A
1        | B
2        | B
2        | C
2        | D
3        | C
3        | E
代码层次结构表-如果客户有条件代码,则不应包括的代码层次结构(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)

我尝试了一些不同的方法(内部连接、左/右连接、子查询等),但我就是无法得到我正在寻找的结果

作为基本查询,这将返回所有代码:

SELECT 
    Customer.CustomerName, 
    Code.CodeDesc  
FROM 
    Customer 
        INNER JOIN CustomerCode
            ON Customer.CodeId = CustomerCode.CodeId
        INNER JOIN Code
            ON CustomerCode.CodeId = Code.CodeId
这只返回条件代码(我理解原因,但我认为当时值得一试):

我尝试了一个子查询(没有可用的代码),结果删除了所有的删除码,不管成员是否具有合格的层次结构(即,即使没有a,也不会返回带有B的客户行)

我有一个想法,就是在子查询上方创建基本查询,并将其与CodeHierarchy表连接起来,但我一直在思考如何编写查询:

SELECT
    *
FROM
    (
        base query (with all codes)
    ) CustomerCodesAll
        INNER/LEFT JOIN CodeHierarchy
            ON ?
我也读了一些关于CTE的书,但我不知道如何利用这项技术

这将最终成为一个要查询的视图,用于报告目的。customer表包含更多的数据,包括dob、性别、公司状态等。该视图将非常直观,可以提取所有内容。针对该视图的查询将包括dob、性别等的where子句

谁能给我指出正确的方向吗

谢谢你的帮助

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

工作起来很有魅力。我想我把它复杂化了。谢谢
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