Помогите составить запрос (схема предоставлена) - PullRequest
1 голос
/ 08 апреля 2011

Вот схема для базы данных: 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 ]

1 голос
/ 08 апреля 2011
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 голос
/ 08 апреля 2011

Другие ответы правильно указали на пропущенное ключевое слово 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').

Как я уже говорил ранее, с более старым синтаксисом, который вы используете в настоящее время, это условие будет в одном предложении с условиями соединения.В более простых случаях, таких как ваш, его можно было бы пропустить без проблем, но в более сложных запросах это может стать проблемой, если не кошмаром, с точки зрения удобства обслуживания.Так что смысл в том, чтобы привыкнуть к новому синтаксису, прежде чем начинать писать такие сложные запросы.

1 голос
/ 08 апреля 2011

Почти верно, я полагаю. Отсутствует ключевое слово 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...