【发布时间】:2014-06-30 09:49:04
【问题描述】:
设置:Microsoft Access 2010(目前没有其他可能),项目表包含projectName(文本)和statusID(整数)和generationID(整数)的列。整数列指的是它们各自的表,我可以在其中检索它们的短名称和长名称。
目标:
我/用户可以在列表框中选择某个代的名称的表单,然后该表单将显示具有所选代的所有项目。在现实生活中,这有点复杂,因为当然还有更多的列。 ;-)
过滤值后,我需要创建报告,然后将其导出为 PDF
LibreOffice Base 使用子表单和过滤表实现了目标(表单、报告所有内容)。我有用于执行所有操作的 SQL 查询的工作代码。但是ooBase是不可能的。
SELECT "ftse"."stateTextShort", "ftgn"."genName", IFNULL( "p"."projGen", 9999 ) AS "pGn",
FROM "01_Projects" AS "p", "filterTable" AS "fT"
LEFT OUTER JOIN "10_State" AS "s" ON "p"."projState" = "s"."stateID"
LEFT OUTER JOIN "20_Generation" AS "g" ON "p"."projGen" = "g"."genID"
LEFT OUTER JOIN "10_State" AS "ftse" ON "fT"."filterState" = "ftse"."stateID"
LEFT OUTER JOIN "20_Generation" AS "ftgn" ON "fT"."filterGen" = "ftgn"."genID"
WHERE "pIx" = IFNULL( ( SELECT "filterProjIndex" FROM "filterTable" ), "pIx" )
AND "pSe" = IFNULL( ( SELECT "filterState" FROM "filterTable" ), "pSe" )
ORDER BY "p"."projName" ASC
我希望我没有用那个 SQL 语句生成完整的垃圾,因为它更长并且包含更多列。
问题:
- 我无法在我的 Access 版本中使用
IFNULL或COALESCE。如何忽略没有值的过滤器? - 使用过滤器列的方法是否正确?
- 如何在Access中实现上面的查询。我生成了以下内容:已解决
[格式化中断。我是新手,不知道更好]
SELECT ps.prjNameIntern, ss.stateShort, gn.genShort
FROM 001_projects AS ps
LEFT JOIN 010_status AS ss ON ps.prjStateID = ss.stateID
LEFT JOIN 020_generation AS gn ON ps.prjGenID = gn.genID
WHERE ps.prjStateID=(SELECT [ft].[fltrState] FROM [999_filterTable] AS ft)
但是对于这两个 JOIN 语句,它不起作用。一旦我遗漏了第二个或第一个和相应的列,它就可以正常工作。 已解决
很多问号……
更新:
好的,我现在可以使用多个 JOIN 语句。偶然发现了draftview和SQL-View的区别,不理解Access的括号样式。
剩下的问题是如何在不使用VBA的情况下直接在SQL中解决IFNULL和COALESCE的缺失问题。
我尝试了类似以下代码来测试 CASE 或 IIF 的使用
SELECT fr.fltrState, fr.fltrPltf,
CASE WHEN fr.fltrPltf = 0 THEN 9999 ELSE fr.fltrPltf END
FROM 999_filterTable AS fr
但我只给我:Syntaxerror (missing operator) in statement...
我现在有
SELECT
IIF(fr.fltrState=0, 9999, fr.fltrState) AS IIFState,
IIF(fr.fltrGen=NULL, 9999, fr.fltrGen) AS IIFGen
FROM 999_filterTable AS fr
它返回 fltrState 的值,但如果该列为空,它不会返回 9999。
【问题讨论】:
标签: sql ms-access ms-access-2010