我正在使用较旧的代码,我不是原作者。
先前执行的查询,但包含逻辑错误,因此返回我不想在查询结果中返回的记录。
为了基本上“删除”这些结果,我添加了一个子查询。 Where子句中的此子查询只是查看给定的唯一键是否已存在于数据库中。如果是,那么该记录将不会在结果中返回 - 至少,这是我的意图。
虽然我已经编写并测试了它自己的子查询(它似乎在iteslf运行时工作)但是当我添加到我打算修复的SQL代码的Where条件时,它会导致'无效使用Null'错误
这是我写的子查询的代码:
WHERE (cstr([UBS Reps DTP].[Dealer]) + cstr([UBS Reps DTP].[Dealerbrch]) + cstr([UBS Reps DTP].[Branch Rep ID])) not in
(
SELECT [Salespage Reps].[Trade_Firm]+[Salespage Reps].[Trade_Office]+[Salespage Reps].[Trade_Rep] AS Expr1
FROM [Salespage Reps]
WHERE ((([Salespage Reps].Trade_Firm)="0000221") AND (([Salespage Reps].Trade_Rep) Is Not Null)) AND (([Salespage Reps].Trade_Office) Is Not Null)
)
这是将子查询添加到原始SQL代码的其余部分:
SELECT dbo_TRADE_ARCHIVE.REP_NAME, [UBS Reps DTP].[Name First], [UBS Reps DTP].[Name Last], [UBS Reps DTP].[Crd Number], dbo_TRADE_ARCHIVE.TRADE_FIRM_ORIG, dbo_TRADE_ARCHIVE.TRADE_OFFICE_ORIG, dbo_TRADE_ARCHIVE.TRADE_REP_ORIG
FROM dbo_TRADE_ARCHIVE LEFT JOIN [UBS Reps DTP] ON (dbo_TRADE_ARCHIVE.TRADE_OFFICE_ORIG=[UBS Reps DTP].Dealerbrch) AND (dbo_TRADE_ARCHIVE.TRADE_REP_ORIG=[UBS Reps DTP].[Branch Rep Id])
WHERE (cstr([UBS Reps DTP].[Dealer]) + cstr([UBS Reps DTP].[Dealerbrch]) + cstr([UBS Reps DTP].[Branch Rep ID])) not in
(
SELECT [Salespage Reps].[Trade_Firm]+[Salespage Reps].[Trade_Office]+[Salespage Reps].[Trade_Rep] AS Expr1
FROM [Salespage Reps]
WHERE ((([Salespage Reps].Trade_Firm)="0000221") AND (([Salespage Reps].Trade_Rep) Is Not Null)) AND (([Salespage Reps].Trade_Office) Is Not Null)
)
GROUP BY dbo_TRADE_ARCHIVE.REP_NAME, [UBS Reps DTP].[Name First], [UBS Reps DTP].[Name Last], [UBS Reps DTP].[Crd Number], dbo_TRADE_ARCHIVE.TRADE_FIRM_ORIG, dbo_TRADE_ARCHIVE.TRADE_OFFICE_ORIG, dbo_TRADE_ARCHIVE.TRADE_REP_ORIG, dbo_TRADE_ARCHIVE.ERROR_CODE, dbo_TRADE_ARCHIVE.ARCHIVE_DATE
HAVING (((dbo_TRADE_ARCHIVE.TRADE_FIRM_ORIG)="0000221") AND ((dbo_TRADE_ARCHIVE.ERROR_CODE) Is Not Null) AND ((dbo_TRADE_ARCHIVE.ARCHIVE_DATE)>Date()-3))
ORDER BY dbo_TRADE_ARCHIVE.TRADE_OFFICE_ORIG, dbo_TRADE_ARCHIVE.TRADE_REP_ORIG;
在这里,只是为了彻底,是一个错误的图片。
似乎MS Access不喜欢我的子查询,因为它担心我将尝试连接空值,并且它不知道如何处理这些值。但据我所知,我已经通过告诉子查询永远不会返回记录{<1}} 告诉MS Access如何在我的子查询中处理空值
我也知道WHERE ((([Salespage Reps].Trade_Firm)="0000221") AND (([Salespage Reps].Trade_Rep) Is Not Null)) AND (([Salespage Reps].Trade_Office) Is Not Null)
永远不会处理空值的事实,因为我已经在物理上检查了链接的Excel表中的空值(没有)。
感谢您的帮助。
答案 0 :(得分:0)
尝试更改此行:
WHERE (cstr([UBS Reps DTP].[Dealer]) + cstr([UBS Reps DTP].[Dealerbrch]) + cstr([UBS Reps DTP].[Branch Rep ID])) not in
到:
WHERE (Nz([UBS Reps DTP].[Dealer], "") & Nz([UBS Reps DTP].[Dealerbrch], "") & Nz([UBS Reps DTP].[Branch Rep ID], "")) not in
如果您的子查询单独运行,我认为可能是WHERE连接的问题。我喜欢使用&amp;运算符,因为它将隐式转换应用于字符串。 Nz就像SQL中的ISNULL;在这种情况下,如果找到空值,我们将始终返回一个0长度的字符串,因此连接操作永远不会失败。