以下是数据库的架构: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
谢谢。
答案 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 by
和order by
子句的错误顺序。关于你的建议应该没有问题。
另一件事是您用于连接表的语法。虽然技术上不是一个错误,但它被认为是过时的。较新的标准提供了用于加入的专用关键字,这使您可以将加入逻辑与按值过滤的逻辑分开,以前按照旧标准,必须在一个子句WHERE
子句中混合使用。
让我通过为您重写FROM
和WHERE
条款来展示这一点,以便您可以看到差异。首先,这是您当前的连接逻辑实现:
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')
这样的条件。
就像我之前所说的,使用当前使用的旧语法,该条件将在带有连接条件的一个子句中。在更简单的情况下,与您的一样,它可能会被忽视而没有问题,但在更复杂的查询中,就可维护性而言,它可能成为一个问题,如果不是噩梦。所以重点是在开始编写这样复杂的查询之前习惯较新的语法。