Подзапрос в SQL Server Compact Edition: таблица обновлений из другой таблицы [duplicate]

Обозначение скобок может использовать переменные, поэтому полезно в двух случаях, когда точечная нотация не будет работать:

1) Когда имена свойств динамически определяются (когда точные имена неизвестны до времени исполнения) .

2) При использовании цикла for..in для прохождения всех свойств объекта.

источник: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Working_with_Objects

6
задан Kev 14 March 2009 в 09:44
поделиться

2 ответа

Мой единственный опыт в запросах связан с 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» "после вашего подзапроса ... возможно, у вас нет выбора в отношении имени столбца, который выходит из подзапроса после того, как вы уже создали подзапрос.

5
ответ дан David Grayson 24 August 2018 в 10:18
поделиться
  • 1
    Спасибо чувак. Первый запрос не работал, но второй сделал - отлично. Он возвращает NULL для экземпляров, где счетчик равен 0, но на основе данных, которые, как я знаю, я получу, я около 99.99% уверен, что никогда не будет 0 отсчетов. Еще раз спасибо, Azuka – Zahymaka 14 March 2009 в 11:56
  • 2
    Круто, хорошо знать, что это сработало! Если вы хотите быть на 100% уверенным, что это значение не равно нулю, вы можете заменить S.numprogs на «IF (S.numprogs IS NULL, 0, S.numprogs)» или использовать сокращенную нотацию, которая «& quot; IFNULL (S.numprogs, 0) " – David Grayson 14 March 2009 в 21:10

Ограничение в SQL CE заключается в том, что оно не поддерживает подзапросы, возвращающие скалярное значение. Подзапросы, возвращающие набор, отлично разбираются.

Подзапрос в соединении в ответе Грейсона возвращает набор, поэтому он должен работать. Иногда скалярный подзапрос нельзя избежать в состоянии соединения. Используя 'IN' вместо '=', парсер может быть обманут.

См. Мой ответ на этот вопрос .

23
ответ дан Community 24 August 2018 в 10:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: