【问题标题】:Help construct a query (schema provided)帮助构建查询(提供模式)
【发布时间】:2011-08-01 05:08:10
【问题描述】:

这是数据库的架构:http://i.stack.imgur.com/omX60.png

哪家公司的权利最少?

请告诉我我的答案有多么错误。

select top 1 companyName
serialNumber_tbl as sn, Entitlement_tbl as ent, Company_tbl as c
where sn.serialNumberId = ent.serialNumberId
and c.companyId = sn.companyId
order by count(distinct entitlementId) asc
group by companyName

谢谢。

【问题讨论】:

    标签: sql tsql schema


    【解决方案1】:

    其他答案正确指出了缺少的from 关键字以及group byorder by 子句的错误顺序。听从你那里得到的建议应该没有问题。

    另一件事是您用于连接表的语法。虽然在技术上不是错误,但它被认为是过时的。较新的标准为加入提供了专用的关键字,这使您可以将加入逻辑与按值过滤的逻辑分开,以前,根据旧标准,必须将其混合在一个子句中,即WHERE 子句。

    让我通过为您重写FROMWHERE 子句来展示这一点,这样您就可以看到不同之处。首先,这是您当前的连接逻辑实现:

    FROM serialNumber_tbl AS sn,
         Entitlement_tbl AS ent,
         Company_tbl AS c
    WHERE sn.serialNumberId = ent.serialNumberId
      AND c.companyId = sn.companyId
    

    WHERE 子句中的两个条件都是连接条件。以下是使用新语法后相同代码片段的变化:

    FROM serialNumber_tbl AS sn
      INNER JOIN Entitlement_tbl AS ent ON sn.serialNumberId = ent.serialNumberId
      INNER JOIN Company_tbl AS c ON c.companyId = sn.companyId
    

    在这种情况下,WHERE 子句当然完全消失了,但您不应该有错误的印象,即它总是这样。通常WHERE 子句仍然有效且有用。如果它包含一些不属于连接逻辑的其他条件,它们将在WHERE 子句中保留位置。我说的是ent.Date < '19900101' AND c.CompanyName NOT IN ('IBM', 'Microsoft') 之类的条件。

    就像我之前所说的,对于您目前使用的旧语法,该条件将在一个带有连接条件的子句中。在像您这样的简单情况下,它可能会被忽略而不会出现问题,但在更复杂的查询中,就可维护性而言,如果不是噩梦,它可能会成为一个问题。因此,在开始编写如此复杂的查询之前,关键是要习惯新的语法。

    【讨论】:

      【解决方案2】:
      select top 1 companyName
      **from** serialNumber_tbl as sn, Entitlement_tbl as ent, Company_tbl as c
      where sn.serialNumberId = ent.serialNumberId
      and c.companyId = sn.companyId
      group by companyName
      order by count(distinct entitlementId) asc
      

      【讨论】:

        【解决方案3】:

        差不多吧,我想。缺少FROM 关键字,并且GROUP BY 必须在ORDER BY 之前。

        select top 1 companyName
        from serialNumber_tbl as sn, Entitlement_tbl as ent, Company_tbl as c
        where sn.serialNumberId = ent.serialNumberId
        and c.companyId = sn.companyId
        group by companyName
        order by count(distinct entitlementId) asc
        

        【讨论】:

          猜你喜欢
          • 2011-08-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-02-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多