我试图从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。)。
答案 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'
。