代码之家  ›  专栏  ›  技术社区  ›  Nick Fleetwood

SQL查询不存在

  •  0
  • Nick Fleetwood  · 技术社区  · 6 年前

    Main有许多字段,如Invo、InvoDate和Amount。

    付款很简单;它只有PayInvo和DueInvo[和PK]

    我得弄清楚2019年底哪些东西还没付清。 我的方法如下。 [Main.Ac1是帐户。所有应付账款均在2000年至2999年之间]

    SELECT * FROM Main 
    WHERE InvoDate BETWEEN #1/1/2019# AND #12/31/2019# 
    AND Main.Ac1 BETWEEN 2000 AND 2999 
    AND NOT EXISTS 
    ( 
    SELECT * FROM 
    Payments INNER JOIN Main ON Payments.PayInvo = Main.Invo 
    WHERE Main.InvoDate BETWEEN #1/1/2019# AND #12/31/2019#
    );
    

    0 回复  |  直到 6 年前
        1
  •  3
  •   Nick SamSmith1986    6 年前

    您的问题是 NOT EXISTS 子句与主查询不相关,因此它总是返回一个结果(只要查询中有任何行) Payments 不存在 返回false,查询中没有行。您可以通过不关联子查询来关联子查询 JOIN ing到 Main 而是指 主要 来自外部查询的表:

    SELECT * 
    FROM Main 
    WHERE InvoDate BETWEEN #1/1/2019# AND #12/31/2019# 
      AND Main.Ac1 BETWEEN 2000 AND 2999 
      AND NOT EXISTS 
      ( 
        SELECT *
        FROM Payments
        WHERE Payments.PayInvo = Main.Invo 
      )
    

    注意,您不应该在子查询中需要日期测试,因为它被外部查询覆盖。

        2
  •  0
  •   Lee Mac    6 年前

    select main.* 
    from 
        main left join payments on main.invo = payments.payinvo
    where
        main.invodate between #1/1/2019# and #12/31/2019# and 
        main.ac1 between 2000 and 2999 and 
        payments.payinvo is null