Мой единственный опыт в запросах связан с 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» "после вашего подзапроса ... возможно, у вас нет выбора в отношении имени столбца, который выходит из подзапроса после того, как вы уже создали подзапрос.
Зачем нужен wchar_t? Чем он превосходит short (или __int16 или что-то еще)?
В мире C ++ wchar_t
является отдельным типом (я думаю, что это typedef
в C), поэтому вы может перегружать функции на основе этого. Например, это позволяет выводить широкие символы, а не выводить их числовое значение. В VC6, где wchar_t
было просто typedef
для unsigned short
, этот код
wchar_t wch = L'A'
std::wcout << wch;
выводит 65
, потому что
std::ostream<wchar_t>::operator<<(unsigned short)
был вызван. В более новых версиях VC wchar_t
является отдельным типом, поэтому вызывается
std::ostream<wchar_t>::operator<<(wchar_t)
и выводит A
.
См. Википедия .
По сути, это портативный введите "текст" в текущем языковом стандарте (с умляутами). Он предшествует Unicode и не решает многих проблем, поэтому сегодня он в основном существует для обратной совместимости. Не используйте его, если в этом нет необходимости.
Причина, по которой существует wchar_t
, почти такая же причина, по которой существует size_t
или time_t
- это абстракция, которая указывает, что тип предназначен для представления, и позволяет реализациям выбирать базовый тип, который может правильно представлять тип на конкретной платформе.
Обратите внимание, что wchar_t
не обязательно должен быть 16-битным типом - есть платформы, где это 32-битный тип.
Обычно считается хорошим давать такие вещи, как типы данных осмысленные имена .
Что лучше, char или ] int8 ? Я думаю, что это:
char name[] = "Bob";
намного легче понять, чем это:
int8 name[] = "Bob";
То же самое с wchar_t и int16 .
Когда я читал соответствующие стандарты, мне показалось, что Microsoft испортила этот плохо .
Моя справочная страница для POSIX
:
- wchar_t : Целочисленный тип, диапазон значений которого может представляют собой отчетливый широкий характер коды для всех членов самого большого набора символов, указанного среди локали, поддерживаемые средой компиляции: нуль символ имеет кодовое значение 0 и каждый член переносимого набора символов имеет кодовое значение, равное его значение при использовании в качестве одиночного символа в целочисленном символе константа.
Итак, 16 бит wchar_t недостаточно, если ваша платформа поддерживает Unicode. Каждый wchar_t должен быть отдельным значением для символа. Следовательно, wchar_t из удобного способа работы на уровне символов текстов (конечно, после декодирования из многобайтовой локали) становится совершенно бесполезным на платформах Windows.
wchar_t
- это примитив для хранения и обработки символов Юникода платформы. Его размер не всегда составляет 16 бит. В системах unix wchar_t
32-битный (возможно, пользователи unix с большей вероятностью будут использовать клингонские символы, для которых используются дополнительные биты: -).
Это может создать проблемы при переносе проектов, особенно если вы меняете местами wchar_t
и короткий, или если вы поменяете местами wchar_t
и xerces ' XMLCh
.
Следовательно, имея wchar_t
в качестве другого типа, чтобы сократить очень важен для написания кроссплатформенного кода. Очистка этого была одной из самых сложных частей при переносе нашего приложения на unix, а затем с VC6 на VC2005.
Чтобы добавить на комментарий Аарона - в C ++ 0x мы, наконец, получаем настоящие типы символов Unicode: char16_t и char32_t, а также строковые литералы Unicode.
Он «превосходит» в том смысле, что позволяет разделять контексты: вы используете wchar_t
в контекстах символов (например, строки), и вы используете short
в числовом контексте (числа). Теперь компилятор может выполнять проверку типов, чтобы помочь вам отловить ситуации, когда вы ошибочно смешиваете одно с другим, например, передать абстрактный нестроковый массив short
s в функцию обработки строк.
В качестве побочного узла. (поскольку это был вопрос C), в C ++ wchar_t
позволяет вам перегружать функции независимо от short
, то есть снова предоставлять независимые перегрузки, которые работают со строками и числами (например).
wchar_t - это немного пережиток времени до стандартизации Unicode. К сожалению, это не очень полезно, потому что кодировка зависит от платформы (а в Solaris - от языкового стандарта!), А ширина не указана. Кроме того, нет никаких гарантий, что будут доступны фасеты кодека UTF-8/16/32, или действительно, как вы получите к ним доступ. В общем, это немного кошмар для портативного использования.
Очевидно c ++ 0x будет поддерживать Unicode, но при нынешних темпах прогресса этого может никогда не случиться ...