Обозначение скобок может использовать переменные, поэтому полезно в двух случаях, когда точечная нотация не будет работать:
1) Когда имена свойств динамически определяются (когда точные имена неизвестны до времени исполнения) .
2) При использовании цикла for..in для прохождения всех свойств объекта.
источник: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Working_with_Objects
Мой единственный опыт в запросах связан с MySQL, но, надеюсь, он достаточно схож.
Ваш запрос выглядит странным для меня, потому что ваш подзапрос находится в предложении SELECT. Я никогда не видел этого раньше ... но, видимо, он поддерживается в MySQL. Обычно подзапрос приходит после FROM или LEFT JOIN или JOIN.
Ваш пример достаточно прост, чтобы вы могли реализовать его с помощью LEFT JOIN:
SELECT C.guid, ..., COUNT(distinct D.id) as numprogs
FROM Computers AS C
LEFT JOIN ComputerData as D ON D.computer_id = C.id
В этом случае , LEFT JOIN - это правильный тип соединения, потому что, даже если в таблице D нет соответствующей записи для конкретной записи C, ваш результирующий набор все равно будет содержать, что запись C и numprogs будут равны нулю, как и следовало ожидать.
Если вы действительно хотите использовать подзапрос, попробуйте это:
SELECT C.guid, ..., S.numprogs
FROM Computers AS C
LEFT JOIN
(SELECT computer_id, COUNT(*) as numprogs
FROM ComputerData GROUP BY computer_id) AS S
ON C.id=S.computer_id
Я предлагаю упростить ваш запрос, чтобы получить его как самый простой возможный запрос, который должен работать, т работы. Затем сообщите нам конкретное сообщение об ошибке, возвращаемое движком вашей базы данных.
Редактирование: я прочитал главу MySQL о подзапросах и вам кажется, что вы должны попробовать удалить «как numprograms» "после вашего подзапроса ... возможно, у вас нет выбора в отношении имени столбца, который выходит из подзапроса после того, как вы уже создали подзапрос.
Ограничение в SQL CE заключается в том, что оно не поддерживает подзапросы, возвращающие скалярное значение. Подзапросы, возвращающие набор, отлично разбираются.
Подзапрос в соединении в ответе Грейсона возвращает набор, поэтому он должен работать. Иногда скалярный подзапрос нельзя избежать в состоянии соединения. Используя 'IN' вместо '=', парсер может быть обманут.
См. Мой ответ на этот вопрос .