测试报告的 table 中是否存在一行
Testing if a row exists in a table for a report
我正在尝试编写一份报告,列出来自主 table 的所有行并插入一个字段 ("Y"/"N"),如果该键存在于当前- 使用 table。例如,COLOR_MASTER table 有 256 种颜色 COLOR_NAME (field/key)。 CURRENT_PROJECTS 每个项目都有一行,COLOR_NAME(字段)。我想列出所有 COLOR_MASTER 行,然后在同一打印行上显示 "Y" 或 "N" 如果 COLOR_NAME 用于 CURRENT_PROJECTS table.
我曾尝试在设计视图中乱搞它,但没有成功。创建的 JOIN 看起来基本上是这样的,我想要报告的方式是在破折号之后:
RIGHT JOIN COLOR_MASTER ON CURRENT_PROJECTS.COLOR_NAME =
COLOR_MASTER.COLOR_NAME ON CURRENT_PROJECTS.COLOR_NAME =
COLOR_MASTER.COLOR_NAME;
--------
Color Used
BLUE
RED Y
YELLOW
我没有 JOIN 方面的专业知识,我不明白为什么要创建此 JOIN 或我需要做些什么来修复它。根据我的阅读,我猜它正在尝试进行外部连接。
目前,我只是想显示 COLOR_NAME 是否被使用,因为我不知道如何测试它是否被使用并将其转换为 "Y"。我不在乎颜色是使用一次还是二十次,我真的不想要来自 CURRENT_PROJECTS table.
的任何数据
在 "Used" 列下,我现在在所有行上都有“#Error”。所以,我认为 RIGHT JOIN 有错误。
感谢任何指导。
谢谢
您不必在一次查询中完成所有操作。首先构建一个查询,作为当前使用的所有颜色的 ID。将其命名为 ColorsInUse
并保存。
它可以像这样简单:
SELECT [COLOR_NAME] FROM [CURRENT_PROJECTS] GROUP BY [COLOR_NAME]
那么您所要做的就是运行以下查询:
UPDATE [COLOR_MASTER] SET [MyField]="N"
UPDATE [COLOR_MASTER] SET [MyField]="Y" WHERE [COLOR_NAME] IN [ColorsInUse]
另一种方法是使用 DLookup
。像这样:
UPDATE [COLOR_MASTER] SET [MyField]=IIF(NZ(DLookup("[COLOR_NAME]","[CURRENT_PROJECTS]","[COLOR_NAME]='" & [COLOR_NAME] & "'"),"")="","N","Y")
一些注意事项:您不应使用文本字段(如名称)作为键。您应该始终使用数字 ID。您也不应该使用文本 Y/N。请改用实际的 Yes/No 字段。
我希望 RIGHT JOIN 是在 table 关系生成器中定义的,并且使用 tables 的查询采用已建立的 link。如果要更改查询中的联接类型,然后在设计视图中使用查询,请双击行 linking tables 以打开“联接属性”对话框。
如果Current_Projects中每个项目只有一条记录,并且一种颜色只能使用一次,只需:
SELECT Color_Master.Color_Name, IIf([Current_Projects].[Color_Name] Is Null,"N","Y") AS Used
FROM Color_Master LEFT JOIN Current_Projects ON Color_Master.Color_Name = Current_Projects.Color_Name;
不过,听起来每种颜色都可以用于多个项目。因此需要使用 GROUP BY 或 DISTINCT 查询加入到 Master_Colors table:
SELECT DISTINCT Current_Projects.Color_Name FROM Current_Projects;
SELECT Color_Master.Color_Name, IIf([Query1].[Color_Name] Is Null,"N","Y") AS Used
FROM Query1 RIGHT JOIN Color_Master ON Query1.Color_Name = Color_Master.Color_Name;
这里是all-in-one SQL:
SELECT Color_Master.Color_Name, IIf([Query1].[Color_Name] Is Null,"N","Y") AS Used
FROM (SELECT DISTINCT Current_Projects.Color_Name FROM Current_Projects) AS Query1
RIGHT JOIN Color_Master ON Query1.Color_Name = Color_Master.Color_Name;
如果您不想为 N 个结果显示任何内容,请在表达式中使用不带引号的 Null。
替代方法是 DLookup(),但域聚合函数在查询或文本框表达式中的执行速度可能很慢。
建议不要将计算的值保存到table,需要的时候才计算。
我正在尝试编写一份报告,列出来自主 table 的所有行并插入一个字段 ("Y"/"N"),如果该键存在于当前- 使用 table。例如,COLOR_MASTER table 有 256 种颜色 COLOR_NAME (field/key)。 CURRENT_PROJECTS 每个项目都有一行,COLOR_NAME(字段)。我想列出所有 COLOR_MASTER 行,然后在同一打印行上显示 "Y" 或 "N" 如果 COLOR_NAME 用于 CURRENT_PROJECTS table.
我曾尝试在设计视图中乱搞它,但没有成功。创建的 JOIN 看起来基本上是这样的,我想要报告的方式是在破折号之后:
RIGHT JOIN COLOR_MASTER ON CURRENT_PROJECTS.COLOR_NAME =
COLOR_MASTER.COLOR_NAME ON CURRENT_PROJECTS.COLOR_NAME =
COLOR_MASTER.COLOR_NAME;
--------
Color Used
BLUE
RED Y
YELLOW
我没有 JOIN 方面的专业知识,我不明白为什么要创建此 JOIN 或我需要做些什么来修复它。根据我的阅读,我猜它正在尝试进行外部连接。
目前,我只是想显示 COLOR_NAME 是否被使用,因为我不知道如何测试它是否被使用并将其转换为 "Y"。我不在乎颜色是使用一次还是二十次,我真的不想要来自 CURRENT_PROJECTS table.
的任何数据在 "Used" 列下,我现在在所有行上都有“#Error”。所以,我认为 RIGHT JOIN 有错误。
感谢任何指导。
谢谢
您不必在一次查询中完成所有操作。首先构建一个查询,作为当前使用的所有颜色的 ID。将其命名为 ColorsInUse
并保存。
它可以像这样简单:
SELECT [COLOR_NAME] FROM [CURRENT_PROJECTS] GROUP BY [COLOR_NAME]
那么您所要做的就是运行以下查询:
UPDATE [COLOR_MASTER] SET [MyField]="N"
UPDATE [COLOR_MASTER] SET [MyField]="Y" WHERE [COLOR_NAME] IN [ColorsInUse]
另一种方法是使用 DLookup
。像这样:
UPDATE [COLOR_MASTER] SET [MyField]=IIF(NZ(DLookup("[COLOR_NAME]","[CURRENT_PROJECTS]","[COLOR_NAME]='" & [COLOR_NAME] & "'"),"")="","N","Y")
一些注意事项:您不应使用文本字段(如名称)作为键。您应该始终使用数字 ID。您也不应该使用文本 Y/N。请改用实际的 Yes/No 字段。
我希望 RIGHT JOIN 是在 table 关系生成器中定义的,并且使用 tables 的查询采用已建立的 link。如果要更改查询中的联接类型,然后在设计视图中使用查询,请双击行 linking tables 以打开“联接属性”对话框。
如果Current_Projects中每个项目只有一条记录,并且一种颜色只能使用一次,只需:
SELECT Color_Master.Color_Name, IIf([Current_Projects].[Color_Name] Is Null,"N","Y") AS Used
FROM Color_Master LEFT JOIN Current_Projects ON Color_Master.Color_Name = Current_Projects.Color_Name;
不过,听起来每种颜色都可以用于多个项目。因此需要使用 GROUP BY 或 DISTINCT 查询加入到 Master_Colors table:
SELECT DISTINCT Current_Projects.Color_Name FROM Current_Projects;
SELECT Color_Master.Color_Name, IIf([Query1].[Color_Name] Is Null,"N","Y") AS Used
FROM Query1 RIGHT JOIN Color_Master ON Query1.Color_Name = Color_Master.Color_Name;
这里是all-in-one SQL:
SELECT Color_Master.Color_Name, IIf([Query1].[Color_Name] Is Null,"N","Y") AS Used
FROM (SELECT DISTINCT Current_Projects.Color_Name FROM Current_Projects) AS Query1
RIGHT JOIN Color_Master ON Query1.Color_Name = Color_Master.Color_Name;
如果您不想为 N 个结果显示任何内容,请在表达式中使用不带引号的 Null。
替代方法是 DLookup(),但域聚合函数在查询或文本框表达式中的执行速度可能很慢。
建议不要将计算的值保存到table,需要的时候才计算。