MS Access SQL:使用多个条件创建查询

时间:2017-05-25 13:48:51

标签: sql ms-access

上下文

我在 MS Access 2016 中有一个存储的查询,它通过关系ID来选择来自许多不同表的某些记录,并创建一个有用且可读的表。我有一个' Flags'包含3个条目的表:

  • (1,SourceA)
  • (2,SourceB)
  • (3,Both)

我想创建一个 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];

1 个答案:

答案 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'谁在上面的评论中提供了正确的答案。