2014-06-18 124 views
0

我有3個表:SQL - 選擇列中多次

系統的系統信息

WorkstationID
WorkstationName
製造商
OS

SoftwareInfo

WorkstationID
SoftwareID

SoftwareList

SoftwareID
SoftwareName
SoftwareVersion

每個workstationID有大約20 SoftwareID行(閱讀器,閃存,Java等)我想輸出類似於此:

WorkstationID | OS | Manufacturer| Reader Version | Flash Version | Java Version 
Desktop01  | W7 | Lenovo  | 11.0.7   | 14.X   | 8.X 

我無法弄清楚如何查詢SoftwareList多次和過濾器每查詢,以便它只返回相對於當前WorkstationID的SoftwareVersion。

這是我的代碼到目前爲止,這將不執行:

select 
    systeminfo.WorkstationName, 
    systeminfo.OS, 
    systeminfo.Manufacturer, 
    (Select SoftwareList.SoftwareVersion 
    from systeminfo 
     join softwareinfo on systeminfo.workstationid = softwareInfo.workstationID 
     JOIN SoftwareList on softwareinfo.softwareid = softwarelist.softwareid 
    where SoftwareName = 'Reader' 
     and softwareinfo.workstationid = systeminfo.workstationid) as "Reader" 
from 
    systeminfo 
    join softwareinfo on systeminfo.workstationid = softwareInfo.workstationID 
    JOIN SoftwareList on softwareinfo.softwareid = softwarelist.softwareid 
+0

使用透視功能。順便說一句,這是哪個DB? –

+0

我會研究一下。我正在運行PostgreSQL。 – ChemistryTruck

+0

您的查詢引用SoftwareInfo.FILEVERSION,但我沒有在SoftwareInfo表中看到FILEVERSION? – Greg

回答

0

這裏採取一些gueses,該FILEVERSION是SoftwareVersion。案例並不重要(我不認爲,如果是這樣,那麼我需要更新這個)。而且,這些是外連接,因此,如果該列不存在,就像,如果缺少'Flash'版本,您仍然會得到一行。如果不需要,則將「左連接」更改爲「連接」。那麼如果你的查詢中存在所有的軟件,你將只能得到元組。我不知道這是否合理。對不起,我沒有測試過這個。希望能幫助到你。

select 
    s.WorkstationName, 
    s.OS, 
    s.Manufacturer, 
    sr.softwareversion as "Reader", 
    sf.softwareversion as "Flash" 
    from 
    systeminfo s 
left join 
    softwareinfo sor on (sor.workstationid = s.workstationid) 
left join 
    softwarelist sr on (sr.softwareid = sor.softwareid and sr.softwarename = 'Reader') 
left join 
    softwareinfo sof on (sof.workstationid = s.workstationid) 
left join 
    softwarelist sf on (sf.softwareid = sof.softwareid and sf.softwarename = 'Flash') 
+0

使用這種方法,'SoftwareInfo'可能不需要多次連接,只有'SoftwareList'。 –

+0

謝謝格雷格!這工作完美。只要我有更高的聲譽,我會模仿你。 – ChemistryTruck

+0

謝謝。請查看@Andriy M評論。您可以內部加入一次軟件信息表,然後將所有剩下的加入。此外,上面的hector指向交叉表,我不知道它存在,非常酷(需要安裝擴展)。 – Greg