sql检查所有行只有某些值

时间:2014-05-19 06:17:07

标签: sql sql-server

我有两个表:InvoicesInvoiceDrafts

Invoices中,InvoiceDraftNumber表格中有一个名为InvoiceDraftNumber的列与InvoiceDraft对应。

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

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

我有几个选择的大工作查询 - 选择选择,但我想要更优雅的东西。

这就是我的目标,但我认为我的查询存在一些问题:

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,那么我可以使用此发票草稿

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

1 个答案:

答案 0 :(得分:2)

无需过度思考。我想你想要这样的东西:

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

如果返回0,您可以使用该编号创建发票。如果它返回1,则该数字已用完,如果它返回&gt; 1您的数据存在错误。