是否可以在 table 的条件下左连接 sql select 语句?还是我必须创建中间查询

Is it possible to left join a sql select statement with conditions with a table? or do I have to create intermediate queries

所以我有一个发票 table,我在其中创建了以下查询,我们称它为“IntInvoice”

SELECT *
FROM [U_Concatenar_Invoice Control]
WHERE [U_Concatenar_Invoice Control].[Décision prise] is null
and
[U_Concatenar_Invoice Control].Concatenar is not null
and
[U_Concatenar_Invoice Control].N_AVD is not null;

接下来我创建了另一个查询以左连接另一个 table 与“IntInvoice”查询

SELECT IntInvoice.*
FROM IntInvoice
LEFT JOIN Int_Account 
ON IntInvoice.Concatenar=Int_Account.Concatenar
WHERE Int_Account.Concatenar Is Null and IntInvoice.Concatenar is not null;

它现在工作得很好,但是否可以将所有这些都放在同一个查询中,以避免在我必须处理数据时不得不创建大量它们?

澄清一下我的评论,我认为你可以将这两个组合成一个查询:

SELECT [U_Concatenar_Invoice Control].*
FROM
  [U_Concatenar_Invoice Control]
  LEFT JOIN Int_Account 
    ON [U_Concatenar_Invoice Control].Concatenar=Int_Account.Concatenar
WHERE
  [U_Concatenar_Invoice Control].[Décision prise] is null and
  [U_Concatenar_Invoice Control].Concatenar is not null and
  [U_Concatenar_Invoice Control].N_AVD is not null and
  Int_Account.Concatenar Is Null and
  -- this is duplicated from above so should not be necessary:
  [U_Concatenar_Invoice Control].Concatenar is not null

在少数情况下这不可能(或不容易),但这是一个相对简单的集成查询。

例如,如果两个查询都 aggregate/group 并且您想加入结果。

-- 编辑 2022 年 4 月 20 日 --

根据您的最新评论,其中 Int_Account 实际上是以下内容:

SELECT * FROM U_Concatenar_AccountManagement WHERE 
U_Concatenar_AccountManagement.Status_AVD="À traiter";

您可以按如下方式重写上面的查询:

SELECT [U_Concatenar_Invoice Control].*
FROM
  [U_Concatenar_Invoice Control]
  LEFT JOIN [U_Concatenar_AccountManagement] ON
    [U_Concatenar_Invoice Control].Concatenar=Int_Account.Concatenar and
    [U_Concatenar_AccountManagement].Status_AVD="À traiter"
WHERE
  [U_Concatenar_Invoice Control].[Décision prise] is null and
  [U_Concatenar_Invoice Control].Concatenar is not null and
  [U_Concatenar_Invoice Control].N_AVD is not null and
  [U_Concatenar_AccountManagement].Concatenar Is Null -- fixed
   --  [Int_Account.Concatenar] Is Null  -- replaced this

我的猜测(这只是一个猜测)是您添加了:

[U_Concatenar_AccountManagement].Status_AVD="À traiter"

到“where”子句而不是作为连接的一部分。我不太了解 Access,但在标准 SQL 中,这意味着两个截然不同的事情:

from x                               from x
  left join y on x.id = y.id           left join y on x.id = y.id
     and y.z = 'Foo'                 where y.z = 'Foo'

左边的保留左连接,只在条件为真的记录上进行左连接。右边的那个有效地将你的左连接转换为内部连接,根据你的查询的其余部分,它看起来像 would return 零结果(你只想要记录在哪里你没有在 y 中找到匹配项)。

试一试,看看是否有效。希望您可以遵循此模式并消除对这么多子查询(查询的查询)的需求。在很长的 运行 中,这些很难维护,因为您每次都必须沿着面包屑的踪迹返回。

-- 编辑 2022 年 4 月 21 日 --

我知道您已经解决了这个问题,但我必须知道...结果正如您发现的那样,Access 不支持连接中的 where 条件。我觉得这很疯狂。但是,您可以通过创建内联子查询并将条件放在那里来实现相同的目标。

以下是对我有用的方法:

SELECT [U_Concatenar_Invoice Control].*
FROM [U_Concatenar_Invoice Control]
LEFT JOIN (select * from U_Concatenar_AccountManagement where Status_AVD="À traiter") AS X
  ON [U_Concatenar_Invoice Control].Concatenar = X.Concatenar
WHERE
  [U_Concatenar_Invoice Control].[Décision prise] Is Null AND 
  [U_Concatenar_Invoice Control].Concatenar Is Not Null AND
  [U_Concatenar_Invoice Control].N_AVD Is Not Null AND
  X.Concatenar Is Null;

在我看来,这并不比您用来进行两个查询的方法好,一个查询调用另一个查询。你在简洁中获得了什么,却在透明度中失去了。选择一个或另一个;两者都不理想。