簡體   English   中英

有條件的加入

[英]Conditional JOIN

我想知道是否有可能在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語句將有所不同,具體取決於數據。 例如:

我在具有“狀態”字段的表中有一條記錄,其中有三種可能性: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];

將兩個集合交叉連接到視圖中,然后將條件放入選擇中。 對此視圖進行2個視圖。 將2個視圖合並在一起。

您可以創建一個UNION查詢,將要有條件地加入的三個表結合在一起,包括一個“ Some_Value”列,該列將包含要加入的項目。 本質上,對於包含在UNION中的每個表,將“ Some_Value”列的值設置為可在where子句中使用以區分事物的值。 然后創建一個整體查詢,該查詢連接(在您的示例中為table2)到聯合查詢,並使用WHERE子句將記錄限制為所需的記錄。 我過去在項目上做過類似的事情,並取得了巨大的成功。

感謝您的回答。 我知道雖然沒有很好的解釋,但是最后,我可以通過編寫子查詢來解決此問題。

將所有五個表連接在一起,並在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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM