【问题标题】:Where statement to exclude records but only if another column equals xWhere 语句排除记录,但仅当另一列等于 x 时
【发布时间】:2019-04-22 14:41:22
【问题描述】:

我正在尝试从 sql select 语句中排除记录,其中我的 salesfacts 表中最细的列是发票号,但问题是发票号可能在前几年使用过(我检查了 26表中的重复项)。我知道这是一个业务规则问题,但我没有能力更改它。

我试图从中排除的代码是长 sql 语句的一部分,该语句包含三个主要部分,这些部分与联合语句相结合,这三个部分是:应收账款、未结订单和日记帐分录。在这种情况下,我试图从“应收账款”部分中排除记录。

因此,对于这种情况,我试图从应收账款部分中排除 5 个发票编号,但前提是它们发生在 2019 年 3 月。(这样可以确保我不会排除以前可能存在或不存在的重复发票编号期)。也许我是偏执狂,我想排除的记录实际上被重复的可能性很小,但如果业务规则允许重复,我不想冒产生意外结果的风险。

我想找到一种干净的方法将这些添加到简单的 where 语句中而不是使用“除外”,因为将来我将不得不排除其他记录,而且我不知道多个例外和联合是否会起作用。

不工作:

Select invoicedate,invoiceno
from saleshistory
where (invoiceno != '1001' and invoicedate = '2011-01-14')

上面显示了发票日期为 2011 年 1 月 14 日的所有记录,除了发票编号 1001。我希望代码显示除发票编号 1001 以外的所有记录,如果它发生在 2011 年 1 月 14 日。

【问题讨论】:

    标签: sql tsql


    【解决方案1】:

    语句可以这样写:

    Select invoicedate,invoiceno
    from saleshistory
    where (invoiceno <> '1001' or invoicedate <> '2011-01-14')
    

    因为你想否定这个:

    invoiceno = '1001' and invoicedate = '2011-01-14'
    

    所以:

    NOT (invoiceno = '1001' and invoicedate = '2011-01-14')
    

    等价于

    invoiceno <> '1001' or invoicedate <> '2011-01-14'
    

    【讨论】:

    • 我知道有一个简单的答案!谢谢你。显然我需要回到我的旧逻辑教科书。我将多条记录与“不在”结合起来,它的工作原理是一样的
    • 逻辑、布尔代数等令人难忘。
    【解决方案2】:

    我不知道我是否理解你:

    Select invoicedate,invoiceno
    from saleshistory
    where (invoiceno != '1001' or ( invoiceno = '1001' and invoicedate = '2011-01-14'))
    

    有了这个,你可以得到任何日期invoiceno与1001不同的所有记录,以及invoiceno 1001和日期2011-01-14的记录。

    【讨论】:

      【解决方案3】:

      我试图从应收账款部分中排除 5 个发票编号,但前提是它们发生在 2019 年 3 月

      下面实现了这个逻辑:

      select sh.*
      from saleshistory sh
      where not (invoiceno in ( . . . ) and  -- list of invoice numbers here
                 invoicedate >= '2019-03-01' and
                 invoicedate < '2019-04-01'
                );
      

      鉴于文本中的描述,我很困惑为什么您的示例查询中有常量 '2011-01-14'

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-12-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-10-18
        相关资源
        最近更新 更多