2016-02-23 126 views
0

我正在MS Access 2010中執行SELECT語句中的一系列UNION。在所有這些UNION完成之後,我需要使用IIF語句(即基於ch列的值)添加幾個新列。但是,我似乎無法找出如何或在哪裏正確擠壓這種語法,以便IIF檢查最後'聯合'表中的整個列。簡單地說,在下面的語法(對於這個問題進行修剪和簡化)運行後,我想根據現有的列單元格(例如,'''')來追加一個新的變量列(例如'星號'等級')包含星號。非常感謝幫助和耐心 - 我只是熟悉SQL的語法原理。select語句之外的SQL - IIF子句?

SELECT * FROM(
     SELECT class, teacher, student 
     grades2010 AS grades 
     WHERE NOT(grades2010 IS NULL OR grades2010="") 
     UNION 
     SELECT class, teacher, student 
     grades2011 AS grades 
     WHERE NOT(grades2011 IS NULL OR grades2011="") 
     UNION 
     SELECT class, teacher, student 
      grades2012 AS grades 
      WHERE NOT(grades2012 IS NULL OR grades2010="") 
) 

這裏是我想IIF類型的實例運行 - 看「成績」包含一個星號,並創建一個指標:

IIF(InStr([grades],"*")>0,"YES","NO") AS asterisk 

回答

1

所以......你是在正確的軌道。它看起來是這樣的:

SELECT 
    IIF(InStr([grades],"*")>0,"YES","NO") AS asterisk, 
    class, 
    teacher, 
    student 
FROM(
     SELECT class, teacher, student 
     grades2010 AS grades 
     WHERE NOT(grades2010 IS NULL OR grades2010="") 
     UNION 
     SELECT class, teacher, student 
     grades2011 AS grades 
     WHERE NOT(grades2011 IS NULL OR grades2011="") 
     UNION 
     SELECT class, teacher, student 
      grades2012 AS grades 
      WHERE NOT(grades2012 IS NULL OR grades2010="") 
) as mysubquery 

但是... grades是不是在你的UNION子查詢一欄,所以這是不行的。您需要確保grade列被添加到子查詢中的每個SELECT聲明中,以便在您的主SELECT中對其執行任何操作。

另外值得一提的是你的模式不是最好的。而不是每年都有一張桌子,你應該真的只有一張帶有year的桌子。這會讓你擺脫這些令人討厭的,而且往往是慢的聯盟查詢。你可以通過創建一個表並在那裏使用UNION查詢來從每個基於表的年份執行INSERT,從而很快解決這個問題。