where语句排除记录,但仅当另一列等于x时

时间:2019-04-22 14:41:23

标签: sql tsql

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

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

因此,在这种情况下,我尝试从应收帐款部分中排除5个发票编号,但前提是它们仅出现在2019年3月。(因此,这确保了我不排除先前可能存在或不存在的重复发票编号。期)。也许我有点偏执,因为我想排除的记录实际上被重覆的机会很小,所以可能会很好,但是如果业务规则允许重复,我就不会冒意外结果的风险。

我想找到一种将它们添加到简单的where语句中而不是使用'except'的干净方法,因为将来我将不得不排除其他记录,而且我不知道多个exception和union是否会起作用。

不起作用:

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

上面显示的是发票日期为2011-01-14的所有记录,但invoiceno 1001除外。我希望代码显示除invoiceno 1001以外的所有记录(如果它发生在2011-01-14。)。

3 个答案:

答案 0 :(得分:0)

语句可以这样写:

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'

答案 1 :(得分:0)

我不知道我是否了解你:

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

使用此记录,您可能会在任何日期获得所有发票的日期不同1001以及带有发票1001和日期2011-01-14的记录。

答案 2 :(得分:0)

  

我试图从应收账款部分中排除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'