【问题标题】:SQL Query (pl/sql) for a complicated logic复杂逻辑的 SQL 查询 (pl/sql)
【发布时间】:2011-06-12 12:32:52
【问题描述】:

我已经被这个问题困扰了一段时间。首先解释一下表结构

我的系统中有四个表

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(可以添加到网页的插件类型) 此表列出了每个域可用的插件类型

  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) 的所有插件。 还有一件事,最好选择只有一个插件的网页。但是我有兴趣找出没有这种偏好的解决方案,以后也许我可以改进解决方案。

【问题讨论】:

  • 您在寻找“DISTINCT”命令吗?
  • 具体针对什么数据库?语法不是 100% 相同

标签: sql mysql sql-server oracle plsql


【解决方案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

【讨论】:

    【解决方案2】:

    您可以从另一个角度来看待它,因为您要为每个插件类型返回一行,所以您需要域上的所有插件类型,以及插入该插件类型的示例页面-in,类似于:

    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             
    

    【讨论】:

      【解决方案3】:

      上面的结果(由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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-19
        • 1970-01-01
        相关资源
        最近更新 更多