MS SQL - 3'OR'在一个OR内

时间:2017-10-16 15:39:34

标签: sql sql-server

我有一个使用Microsoft Dynamics 2011创建的视图,我现在希望将其转换为在Excel中使用的SQL代码。

除了OR子句之外,我已经完成了其他所有工作(查询不会返回我期望的所有结果)。我对SQl很新,任何帮助都会非常感激。

AND      (Child.btb_childhealthlastlacmedical is NULL 
OR       Child.btb_childhealthlastlacmedical <= DATEADD(month, -12, GETDATE())) 
AND      (Child.btb_childhealthlastdentaldate is NULL 
OR       Child.btb_childhealthlastdentaldate <= DATEADD(month, -12, GETDATE())) 
AND      (Child.btb_childhealthlastopticiandate is NULL 
OR       Child.btb_childhealthlastopticiandate <= DATEADD(month, -24, GETDATE())) 

最终编辑解决方案下面的xQbert解决方案。非常感谢你!!

3 个答案:

答案 0 :(得分:1)

我认为你正在寻找更像这样的东西。但您可能想要而不是或在括号内。不确定你在寻找什么。但基本上你需要用或代替和

来分隔语句
   AND  (Child.btb_childhealthlastlacmedical is NULL OR
     Child.btb_childhealthlastlacmedical <= DATEADD(month, -12, GETDATE())) 
 OR
     (Child.btb_childhealthlastdentaldate is NULL OR
     Child.btb_childhealthlastdentaldate <= DATEADD(month, -12, GETDATE())) 
 OR
     (Child.btb_childhealthlastopticiandate is NULL OR
     Child.btb_childhealthlastopticiandate <= DATEADD(month, -24, GETDATE())) 

答案 1 :(得分:0)

如果任何字段符合条件

,则返回true
AND ( COALESCE(Child.btb_childhealthlastlacmedical, 
      DATEADD(month, -12, GETDATE())) <= DATEADD(month, -12, GETDATE()) 
OR COALESCE(Child.btb_childhealthlastdentaldate , 
      DATEADD(month, -12, GETDATE())) <= DATEADD(month, -12, GETDATE()) 
OR COALESCE(Child.btb_childhealthlastopticiandate , 
      DATEADD(month, -12, GETDATE())) <= DATEADD(month, -24, GETDATE()) 
)

您还希望将右外连接更改为JOIN(有时称为内连接)这可能是您获得比预期更多结果的原因。

答案 2 :(得分:0)

  1. 不要混合连接符号使用ANSI 92标准(INNER JOIN,OUTER JOIN)而不是89(逗号表示法),您当前的连接将从家庭表中排除未过滤联系人的记录。
  2. - RIGHT OUTER JOINS意味着dbo.FilteredContactcontact是包含所有记录的表。然后来自dbo.filteredAccount的记录与child中的记录相匹配,然后记录匹配的filteredBusinessUnit中的记录。因此,fil.name过滤器属于连接。

    子表上的过滤器属于右表。我真的很惊讶没有其他人抓住我...

    SELECT Child.fullname AS Child
    FROM dbo.FilteredBusinessUnit Fil
    RIGHT JOIN dbo.FilteredAccount Family 
      ON Fil.businessunitid=Family.owningbusinessunit
    RIGHT JOIN dbo.FilteredContact Child 
      ON Child.accountid=Family.accountid
    WHERE (Child.btb_childhealthlastlacmedical is NULL 
       OR Child.btb_childhealthlastlacmedical <= DATEADD(month, -12, GETDATE()) 
       OR Child.btb_childhealthlastdentaldate is NULL 
       OR Child.btb_childhealthlastdentaldate <= DATEADD(month, -12, GETDATE())
       OR Child.btb_childhealthlastopticiandate is NULL 
       OR Child.btb_childhealthlastopticiandate <= DATEADD(month, -24, GETDATE()) )
     AND Child.customertypecode = 1  
     AND Child.owningbusinessunit = 'North West'
    

    注意使用外连接时,除了“所有记录表(此情况下为FilteredContact)”之外的表上的任何限制条件都应放在连接上,否则外连接将被取消,其行为类似于内连接。

    我不确定你为什么要进行空检查,因为有些记录是空的,或者你有空检查以保留来自外连接的记录。如果后者那么这样我们就不需要空检查了。如果是第一个,那么我们需要保持空检查。