帮助构造一个查询(提供的模式)

时间:2011-04-08 04:17:53

标签: sql tsql schema

以下是数据库的架构: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

谢谢。

3 个答案:

答案 0 :(得分:1)

我想,几乎是对的。缺少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

答案 1 :(得分:1)

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

答案 2 :(得分: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')这样的条件。

就像我之前所说的,使用当前使用的旧语法,该条件将在带有连接条件的一个子句中。在更简单的情况下,与您的一样,它可能会被忽视而没有问题,但在更复杂的查询中,就可维护性而言,它可能成为一个问题,如果不是噩梦。所以重点是在开始编写这样复杂的查询之前习惯较新的语法。