Мне интересно, возможно ли это сделать в 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
Это понятно? Если нет, просто спросите, и я отвечу на ваши сомнения.
EDIT:
Я думаю, что я не был достаточно ясен. У меня есть несколько соединений в моем запросе, но у меня есть последнее, в котором оператор ON будет отличаться в зависимости от данных. Например:
У меня есть запись в таблице, в которой есть поле «Состояние» с тремя возможностями: CA, TX, FL.
Если значение равно CA, оператор ON этого JOIN должен быть CA_Standard_table.field = myTable.field.
Если это TX, оператор ON этого JOIN должен быть 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];