Условное присоединение - PullRequest
0 голосов
/ 25 августа 2010

Мне интересно, возможно ли это сделать в 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];

Ответы [ 4 ]

1 голос
/ 22 июня 2012

перекрестное соединение двух наборов в представлении, поместите условие в выбор. сделать 2 просмотра этого вида. Соедините 2 представления вместе.

0 голосов
/ 25 августа 2010

Соедините все пять таблиц вместе и используйте это выражение CASE внутри предложения SELECT, чтобы выбрать соответствующее поле из всех таблиц.

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
0 голосов
/ 26 августа 2010

Спасибо за ответы.Я знаю, что это было не очень хорошо объяснено, но, в конце концов, я мог решить эту проблему, написав подзапрос.

0 голосов
/ 25 августа 2010

Вы можете создать запрос UNION, объединяющий три таблицы, к которым вы хотите условно присоединиться, включая столбец «Some_Value», который будет содержать элемент, к которому вы хотите присоединиться. По сути, для каждой таблицы, включаемой в UNION, задайте для столбца Some_Value значение, которое вы можете использовать в предложении where для различения вещей. Затем создайте общий запрос, который объединяет (в вашем примере table2) с запросом объединения и используйте предложение WHERE, чтобы ограничить записи теми, которые вам нужны. Я сам делал подобные вещи в прошлом с большим успехом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...