我在 MS Access 2016 中有一个存储的查询,它通过关系ID来选择来自许多不同表的某些记录,并创建一个有用且可读的表。我有一个' Flags'包含3个条目的表:
我想创建一个 WHERE 子句,将查询结果限制为只有TableA.Flag等于TableB.Flag的记录,或者TableA的标志为BOTH,TableB的标志为SourceA。
在其他SQL语言中,这可以通过将where条件逻辑分组来轻松实现:
WHERE TableA.Flag = TableB.Flag OR (TableA.Flag = 3 AND TableB.Flag = 1)
但是,MS Access不考虑这个有效的逻辑,并且添加额外的嵌套parantheses(MS Access SQL中通常的解决方法)也没有产生有效的语法。在MS Access SQL中功能性创建等效查询所需的正确语法是什么?
以下是一些也不起作用的例子:
WHERE (TableA.Flag = TableB.Flag) OR ((TableA.Flag = 3) AND (TableB.Flag = 1 ))
WHERE ((TableA.Flag = TableB.Flag) OR ((TableA.Flag = 3) AND (TableB.Flag = 1)))
这是完整的查询(当我去保存它时在where子句行中产生语法错误消息,并且当删除where子句行时不会产生相同的错误消息):
SELECT TableB.ID AS ID
, TableA.Name AS aliasA
, TableC.Name AS aliasC
, TableD.Name AS aliasD
, TableE.Name AS aliasE
, TableF.path AS aliasF1
, TableF.path2 AS aliasF2
, TableG.Property AS aliasG
, TableH.Name AS aliasH
, TableA.Flag AS Flag
FROM (((((( TableB
LEFT JOIN [TableA] ON TableB.aliasA = TableA.ID)
LEFT JOIN TableC ON TableB.PropertyC = TableC.ID)
LEFT JOIN TableD ON TableB.PropertyD = TableD.ID)
LEFT JOIN TableE ON TableB.PropertyE = TableE.ID)
LEFT JOIN TableF ON TableB.PropertyF = TableF.ID)
LEFT JOIN TableG ON TableB.PropertyG = TableG.ID)
LEFT JOIN TableH ON TableB.PropertyH = TableH.ID
WHERE TableA.Flag = TableB.Flag OR (TableA.Flag = 3 AND TableB.Flag = 1)
ORDER BY TableB.ID;
注意:上述声明中 FROM 子句中使用的所有parantheses都是 绝对必要 MS Access SQL,尽管它们在大多数其他SQL语言中被过度使用和可笑地不必要。
更新:简化查询
SELECT [TableB].[ID]
, [TableA].[Name]
, [TableA].[Flag]
FROM [TableB]
LEFT JOIN [TableA] ON [TableB].[PropertyA] = [TableA].[ID]
WHERE [TableA].[Flag] = [TableB].[Flag]
OR ([TableA].[Flag] = 3 AND [TableB].[Flag] = 1)
ORDER BY [TableB].[ID];
答案 0 :(得分:0)
TableA的实际名称是保留字(参数)。在TableA名称周围添加方括号可以很好地工作。事实证明,如果TableA和TableB不是保留关键字,则以下代码是有效语法。
WHERE TableA.Flag = TableB.Flag OR (TableA.Flag = 3 AND TableB.Flag = 1)
否则,代码应为:
WHERE [Parameters].[Flag] = [TableB].[Flag] OR ([Parameters].[Flag] = 3 AND [TableB].[Flag] = 1)
道具是指Tony'谁在上面的评论中提供了正确的答案。