是否可以在 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;
在我看来,这并不比您用来进行两个查询的方法好,一个查询调用另一个查询。你在简洁中获得了什么,却在透明度中失去了。选择一个或另一个;两者都不理想。
所以我有一个发票 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;
在我看来,这并不比您用来进行两个查询的方法好,一个查询调用另一个查询。你在简洁中获得了什么,却在透明度中失去了。选择一个或另一个;两者都不理想。