使用除法(NOT EXIST)查询数据

时间:2019-04-02 14:43:24

标签: sql sql-server

因此,我制定了一个查询来查找在特定时期内所有客户发票中出售的产品。但是,我也想尝试通过使用除法(NOT EXIST)来实现这一点。

这是我到目前为止所实现的。

DECLARE @startdate datetime = '2010-01-01 08:56:01.49';
DECLARE @enddate datetime = '2010-01-02 10:43:17.283';

SELECT Products$.PRODUCT_ID,
       Products$.PRODUCT_NAME,
       CONCAT(DATENAME(MONTH, @startdate), '''', RIGHT(DATENAME(YEAR, @startdate), 2)) AS StardPeriod,
       CONCAT(DATENAME(MONTH, @enddate), '''', RIGHT(DATENAME(YEAR, @enddate), 2)) AS EndPeriod
FROM Products$
WHERE Products$.PRODUCT_ID IN (SELECT InvDetails$.PRODUCT_ID
                               FROM InvDetails$
                               WHERE InvDetails$.INVOICE_ID IN (SELECT Invoices$.INVOICE_ID
                                                                FROM Invoices$
                                                                WHERE Invoices$.INVOICE_DATE BETWEEN @startdate AND @enddate));

2 个答案:

答案 0 :(得分:0)

但是在黑暗中是一击,但是我 假设 (就像我在评论中说的那样),您想要EXISTS,而不是{{1 }}。因此,我会将您的查询重写为:

NOT EXISTS

这实际上可能比嵌套SELECT P.PRODUCT_ID, P.PRODUCT_NAME, CONCAT(DATENAME(MONTH, @startdate), '''', RIGHT(DATENAME(YEAR, @startdate), 2)) AS StardPeriod, CONCAT(DATENAME(MONTH, @enddate), '''', RIGHT(DATENAME(YEAR, @enddate), 2)) AS EndPeriod FROM Products$ P WHERE EXISTS (SELECT 1 FROM Invoices$ I JOIN InvDetails$ ID ON I.INVOICE_ID = ID.INVOICE_ID WHERE I.INVOICE_DATE BETWEEN @startdate AND @enddate AND ID.PRODUCT_ID = P.PRODUCT_ID); 子句的效果更好。

答案 1 :(得分:0)

我认为/*Will check if the whole page is loaded*/ $(document).ready(function() { /*The value="Apply Promo" will be changed after everything is loaded*/ $('input#btn_promo').attr('value','Apply Promo Code'); }); 是执行此操作的非常合适的方法:

JOIN