【问题标题】:sql check that all rows have only certain valuessql 检查所有行是否只有某些值
【发布时间】:2014-05-19 06:17:07
【问题描述】:

我有两张桌子:InvoicesInvoiceDrafts

Invoices 中有一个名为InvoiceDraftNumber 的列对应于InvoiceDraft 表中的InvoiceDraftNumber

如果发票使用发票草稿,则发票草稿编号将出现在 Invoice 表的 InvoiceDraftNumber 列中。如果发票未使用任何发票草稿,则 null 将出现在 Invoice 表中的列 InvoiceDraftNumber 中。发票可以处于已发送或已拒绝状态。发票汇票只能使用一次,但如果使用过的发票被拒绝,则可以再次使用发票汇票。我需要通过这种方式检查发票草稿是否已被使用:

  • 取我需要检查的发票草稿号('12345')
  • 如果没有发票使用它(选择表单 Invoices where InvoiceDraftNumber = '12345')- 将给出 0 行,如果有一些行,则所有选定的行都应处于拒绝状态。

我有一个来自多个选择的大工作查询 - select on select ,但我想要更优雅的东西。

这是我想出的,但我认为我的查询存在一些问题:

SELECT COUNT(Invocies.ID)
FROM InvoiceDrafts DRAFT 
LEFT OUTER JOIN Invoices INVOICE on DRAFT.InvoiceDraftNumber = INVOICE.InvoiceDraftNumber
WHERE DRAFT.InvoiceDraftNumber = '12345'
  AND (INVOICE.UID is null
       OR INVOICE.Status not like 'Rejection')
GROUP BY Status

计数不是处于“拒绝”状态的行,这意味着如果计数为 0,那么我可以使用此发票草稿

这个查询会给我预期的结果吗?

【问题讨论】:

  • 是否可以用另一种方式表达这句话:“对于任何特定的InvoiceDraftNumber 值,最多一个Invoice 条目可以是'Sent'”?
  • 不,抱歉。改写为“发票号码不在发票中,或者如果在发票中,则所有状态均为“拒绝””
  • 所以一旦草稿被拒绝,就不能永远被成功使用吗?如果它永远无法成功,允许它被重用有什么意义?
  • 相反,如果发票被拒绝(我们说的发票使用发票草稿),则发票草稿可以再次使用。发票草稿一张发票只能使用一次,但如果发票已被拒绝,则发票草稿被视为未使用,因为使用它的发票不再有效
  • 所以,在 some 点,草稿将被再次使用,如果它成功了,你会不会以 one 行结束Sent 的状态,在那之后,您不想再次使用该号码?

标签: sql sql-server


【解决方案1】:

没必要想太多。我想你想要这样的东西:

 SELECT COUNT(*)
 FROM   Invoices
 WHERE  InvoiceDraftNumber = '12345'
 AND    Status <> 'Rejection'

如果返回 0,您可以使用该编号创建发票。如果返回 1,则该数字已用完,如果返回 > 1,则说明数据有误。

【讨论】:

  • 不完全是我的情况。 invoiceedraftnumber 不在 Invoices 中,或者如果在 Invoices 中,则所有状态均为“拒绝”
  • 所以,我不明白你的问题。如果InvoiceDraftNumber 不在Invoices 中,它会返回0。如果InvoiceDraftNumber 在发票中并且所有状态都是'Rejection',那么它将返回0。如果已经存在一行,它只会返回1给定InvoiceDraftNumber,其状态不是'Rejection'。我误会了什么?
  • 我会检查这个,如果这是我的解决方案,我会投票给你
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-05
  • 1970-01-01
  • 2012-06-04
  • 1970-01-01
  • 2015-04-23
  • 1970-01-01
  • 2019-02-14
相关资源
最近更新 更多