其他答案正确指出了缺少的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') 之类的条件。
就像我之前所说的,对于您目前使用的旧语法,该条件将在一个带有连接条件的子句中。在像您这样的简单情况下,它可能会被忽略而不会出现问题,但在更复杂的查询中,就可维护性而言,如果不是噩梦,它可能会成为一个问题。因此,在开始编写如此复杂的查询之前,关键是要习惯新的语法。