我想知道是否可以在MS Access 2007中完成此任务:
一位客户给了我几张桌子,他们向我询问了一些问题。其中一个必须从表中获取字段值,具体取决于每个记录的字段值。这意味着,根据区域,它必须查看一个表,第二个或第三个表。
所以,我想知道我是否可以这样做:
SELECT
table2.some_value
FROM
table1
INNER JOIN table2
ON CASE table1.SOME_VALUE THEN table3.id = table2.some_id ELSE
CASE table1.SOME_VALUE THEN table4.id = table2.some_id ELSE
table5.id = table2.some_id END END
清楚吗?如果没有,请问,我会回答你的疑虑。
修改
我觉得我不够清楚。我的查询中有几个连接,但我有最后一个连接,其中ON语句将根据数据的不同而不同。例如:
我在一个包含State字段的表中有一条记录,有三种可能:CA,TX,FL。
如果值为CA,则该JOIN的ON语句应为CA_Standard_table.field = myTable.field。
如果是TX,那个JOIN的ON语句应该是TX_Standard_table.field = myTable.field
同样的逻辑适用于FL。
我该如何实现?
编辑2:
这是查询代码,最后一个JOIN是对此重要的一个。要在ON语句中加入的表的三种可能性是:
根据检查以下哪个字段,它将决定其中一个:
查询
SELECT
Projects.COMPAS_ID,
Projects.[Opportunity Name],
IIf([VolCap]=True,1) AS [Volume Cap],
IIf([DelGuarantee]=True,1) AS [Delivery Guarantee],
Projects.Tech_Level_Name,
Counterparty.CPExpertise,
Counterparty.CPFinStrength,
Geographic_Location.Country_RiskLevel,
Project_Stage_Risk.ProStaRiskLevel,
Counterparty.CPExperience,
Projects.Country_Name,
IIf([EU ETS]=True,1) AS EU,
IIf([CA ETS]=True,1) AS CA,
IIf([NZ ETS]=True,1) AS NZ,
IIf([Australia ETS]=True,1) AS Australia,
IIf([CAProjectType] is not null, CA_Accepted_Projects.CAPTRiskLevel,
IIf([EUSelProjType] is not null, EU_ETS_Standards.EUPTRiskLevel,
IIf([NZSelProjType] is not null, NZ_Accepted_Projects.NZPTRiskLevel))) as [Risk Level],
IIf([CAStandard] is not null, CA_Accepted_Standards.CAStanRiskLevel,
IIf([EUSelStandard] is not null, EU_Accepted_Standards.EUStanRiskLevel,
IIf([NZSelStandard] is not null, NZ_Accepted_Standards.NZStanRiskLevel))) as [Standard Risk]
FROM
Project_Stage_Risk
INNER JOIN (((((((((Counterparty
INNER JOIN Projects
ON Counterparty.CPID = Projects.[Counter Party])
INNER JOIN Geographic_Location
ON Projects.Country_Name = Geographic_Location.Country_Name)
left JOIN CA_Accepted_Projects
ON Projects.CAProjectType = CA_Accepted_Projects.CA_ProjectTypes)
left JOIN NZ_Accepted_Projects
ON Projects.NZSelProjType = NZ_Accepted_Projects.NZ_StandardID)
left JOIN EU_ETS_Standards
ON Projects.EUSelProjType = EU_ETS_Standards.EU_StandardID)
left JOIN CA_Accepted_Standards
ON Projects.CAStandard = CA_Accepted_Standards.ID)
left JOIN NZ_Accepted_Standards
ON Projects.NZSelStandard = NZ_Accepted_Standards.ID)
left JOIN EU_Accepted_Standards
ON Projects.EUSelStandard = EU_Accepted_Standards.ID)
left join Emissions_Trading_Systems
ON Emissions_Trading_Systems.ETS = EU_Accepted_Standards.ETS)
ON Project_Stage_Risk.ProStaID = Projects.[Project Stage];
答案 0 :(得分:1)
在视图中交叉连接两组,将条件放在select中。制作此视图的2个视图。一起加入2个视图。
答案 1 :(得分:0)
您可以创建一个UNION查询,将要有条件连接的三个表联合在一起,包括一个“Some_Value”列,该列将包含您要加入的项目。实质上,对于您在UNION中包含的每个表,将“Some_Value”列的值设置为可以在where子句中使用的值来区分事物。然后创建一个整体查询,将(在您的示例中为table2)连接到union查询,并使用WHERE子句将记录限制为您需要的记录。我过去在项目上做过类似的事情并取得了巨大的成功。
答案 2 :(得分:0)
感谢您的回答。我知道它没有得到很好的解释,但最后,我可以通过编写子查询来解决这个问题。
答案 3 :(得分:-2)
将所有五个表连接在一起,并在SELECT子句中使用该CASE表达式从所有表中选择适当的字段。
SELECT
CASE table1.some_value
WHEN 'a' THEN table2.some_value
WHEN 'b' THEN table3.some_value
WHEN 'c' THEN table4.some_value
WHEN 'd' THEN table5.some_value
END