有条件的加入

时间:2010-08-25 17:47:32

标签: sql ms-access

我想知道是否可以在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语句中加入的表的三种可能性是:

  • EU_Accepted_Standards
  • CA_Accepted_Standards
  • NZ_Accepted_Standards

根据检查以下哪个字段,它将决定其中一个:

  • CAStandard:它应该采用CA_Accepted_Standards。
  • EUSelStandard:它应该采用EU_Accepted_Standards。
  • NZ_Accepted_Standards:应该采取NZ_Accepted_Standards

查询

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];

4 个答案:

答案 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