0

我对 SQL 完全陌生,只是想通过一些可以帮助我的查询来加快我的工作。

我的示例代码(我将查询限制为一个订单,以显示问题):

SELECT dbo.BI.nmdos, dbo.BI.OBRANO, dbo.bi.ref
, dbo.BI.design, dbo.BI.LOBS, dbo.BI.qtt, dbo.sa.stock
FROM dbo.BI
LEFT JOIN dbo.SA on dbo.SA.REF=dbo.BI.REF
WHERE dbo.BI.FECHADA=0 AND dbo.BI.LOBS <> 'S' 
AND dbo.BI.QTT >= 1 AND dbo.BI.nmdos = 'Encomenda Cliente' 
AND dbo.BI.obrano = 2496

我的结果:

Encomenda Cliente   2496                        rty     5.0000  NULL
Encomenda Cliente   2496    01103402            TONER OKI P/B4000       1.0000  0.000
Encomenda Cliente   2496    PC                  PORTES - COMPRAS        2.0000  1429.000
Encomenda Cliente   2496    CXDVDNORMBL         CAIXA DE DVD NORMAL PRETO FOSCO - 14MM (100)        10.0000 4.000
Encomenda Cliente   2496    CXDVDNORMBL         CAIXA DE DVD NORMAL PRETO FOSCO - 14MM (100)        10.0000 0.000
Encomenda Cliente   2496    CXDVDNORMBL         CAIXA DE DVD NORMAL PRETO FOSCO - 14MM (100)        10.0000 0.000

我的问题:我需要删除带有库存 = 0 的产品代码“CXDVDNORMBL”的最后 2 行。

我应该怎么办?

4

2 回答 2

1

您需要将 dbo.SA.stock > 0 添加到您的加入条件。这样,它只会加入来自 SA 的有一些库存的行。

SELECT dbo.BI.nmdos, dbo.BI.OBRANO, dbo.bi.ref, dbo.BI.design, dbo.BI.LOBS, dbo.BI.qtt, dbo.sa.stock
FROM dbo.BI
LEFT JOIN dbo.SA on dbo.SA.REF=dbo.BI.REF AND dbo.SA.stock > 0
WHERE dbo.BI.FECHADA=0 AND dbo.BI.LOBS<>'S' AND dbo.BI.QTT>=1 AND dbo.BI.nmdos='Encomenda Cliente' AND dbo.BI.obrano=2496
于 2013-07-31T23:08:51.500 回答
0

你的意思是当这些产品缺货时你想从订单中删除行?只需运行另一个查询,删除您之前选择的相同内容,但添加 WHERE stock = 0?

不过,不确定完全删除这些行是否明智。您稍后可能需要这些信息,例如,如果您要向客户发送一封电子邮件,说明某些商品不能包含在他们的订单中,或者只是记录客户订购的内容(即使它从未交付)。因此,我认为每当您对其进行选择时,最好只过滤掉任何库存为 0 的行。或者,如果您出于某种原因确实希望将这些行从订单表中移出,请将它们放在另一个名为 outOfStock 的表中,并将订单 ID 链接到该表中。

于 2013-07-31T23:09:22.017 回答