2011-01-20 147 views
1

我一直在這個問題上停留了一段時間。首先,我要解釋一下表結構複雜邏輯的SQL查詢(pl/sql)

有在我的系統四個表

Columns: 
     DomainID (primary key) 
     DomainName 

Data: 
     DomainID DomainName 
     1000  Google.com 
     2000  mySql.com 

好康

Columns: 
     WebpageID (primary key) 
     WebpageName 
     DomainID (FK from domain table) 
Data: 
    5001 SearchPage.html 1000 
    5002 Welcome.html  1000 
    5003 ContactUs.htm  1000 
    5004 AboutUs.html  1000 

PluginType(PluginsType可添加到網頁) 該表列出了可爲每個域

Columns: 
     PluginType  (primary key) 
     DomainID  (primary key) 
     PluginTypeName 

    Data 
     PluginTypeID  DomainID  PluginTypeName 
     8000     1000    searchButton 
     8001     1000    DropDownMenu 
     8002     1000    InteractiveForm 
     8003     1000    loginForm 
     8004     1000    LogoutForm 

插件的插件類型:每個網頁的域名可以使用任何數量的插件。

 Columns: 
      PluginID  (primary key) 
      WebpageID (FK from webpage table) 
      pluginTypeID (FK from plugintype table) 

     Data: 
     pluginID  WebpageID(Name)   PluginTypeID 
      10001    5001(SearchPage.html) 8000(SearchButton) 
      10002    5001(SearchPage.html) 8001(DropDownMenu) 
      10003    5002 (Welcome.html)  8000 (SearchButton) 
      10004    5002 (Welcome.html)  8001 (DropDownMenu) 
      10005    5002 (Welcome.html)  8004 (lotoutform) 
      10006    5003 (ContactUs.htm) 8003 (loginForm) 
      10007    5004 (AboutUs.htm)  8002 (loginForm) 

現在我想給定一個域ID是什麼,我希望所有的網頁,插件列表可用,這樣該插件不超過一個網頁重複。 換句話說,每個插件的網頁插件組合,以這種方式插件不會在多個網頁中重複使用。

因此域1000(google.com)

我想要的結果是

  5002 (Welcome.html)  8000 (SearchButton) 
      5002 (Welcome.html)  8001 (DropDownMenu) 
      5002 (Welcome.html)  8004 (lotoutform) 
      5003 (ContactUs.htm) 8003 (loginForm) 

我只選擇了5002和5003的網頁,因爲他們包括所有的插件域名1000(google.com)。 還有一件事,最好是選擇一個只有一個插件的網頁。但我有興趣找到沒有這種偏好的解決方案,以後也許我可以改進解決方案。

+0

你在尋找「DISTINCT」命令嗎? – Eugene 2011-01-20 14:55:37

+0

具體爲什麼數據庫?語法不是100%相同 – 2011-01-20 16:40:54

回答

2

你可以看看它從另一個角度來看,因爲你是爲每個插件式返回一行,您需要一個域中的所有插件,typess,與在該插件型是一個示例頁面沿,好了,pluged式,沿着線的東西:

Select PluginTypeName, 
    (select top 1 WebpageName 
    from WebPage w 
     inner join Plugin p on p.WebpageID = w.WebpageID 
    where p.pluginTypeID = pt.pluginTypeID) as SampleWebPage 
From PluginTypes pt 

這將返回類似:

searchButton SearchPage.html 
DropDownMenu SearchPage.html 
InteractiveForm null 
loginForm  ContactUs.html 
lotoutform  Welcome.html    
1
SELECT PluginTypeId, 
     (
     SELECT webpageID 
     FROM plugin pi 
     WHERE pi.pluginTypeId = pd.pluginTypeId 
       AND webPageID IN 
       (
       SELECT WebPageID 
       FROM WebPage 
       WHERE DomainId = 1000 
       ) 
     ORDER BY 
       (
       SELECT COUNT(*) 
       FROM plugin pc 
       WHERE pc.webpageId = pi.webpageId 
       ) 
     LIMIT 1 
     ) AS WebPageId 
FROM Plugin pd 
WHERE WebPageId IS NOT NULL 
0

上述結果(由SWeko提交)應該工作,我是想出來,可給出重複的結果。此外,它將每個域的結果分組...這裏是一個修改:

Select DISTINCT DomainID, pt.PluginTypeName, 
    (select top 1 WebpageName 
    from WebPage w 
     inner join Plugin p on p.WebpageID = w.WebpageID 
    where p.pluginTypeID = pt.pluginTypeID) as SampleWebPage 
From PluginTypes pt 
GROUP BY DomainID, pt.PluginTypeName