Проблема с вашим запросом состоит в том, что при использовании предложения GROUP BY (которое вы по сути делаете с помощью различных) вы можете использовать только столбцы, которые вы группируете или объединяете функции. Вы не можете использовать идентификатор столбца, потому что есть потенциально разные значения. В вашем случае всегда есть только одно значение из-за предложения HAVING, но большинство СУБД недостаточно умны, чтобы это распознать.
Однако это должно работать (и не требует объединения):
UPDATE sales
SET status='ACTIVE'
WHERE id IN (
SELECT MIN(id) FROM sales
GROUP BY saleprice, saledate
HAVING COUNT(id) = 1
)
Вы также можете использовать MAX или AVG вместо MIN, важно использовать только функцию, которая возвращает значение столбец, если есть только одна подходящая строка.
Первое, что мне пришло в голову, тоже было «тройник». Итак, давайте объединим C и оболочку с помощью popen:
FILE * multi_out;
multi_out = popen( "tee file1.out > file2.out", "w");
/* error checks, actual work here */
pclose( multi_out);
/* error checks here */
Как фанатик Unix, я предположил, что вы не пробуете это в Windows.
Используйте funopen
или fwopen
и укажите свою собственную функцию записи, которая записывает в несколько FILE *
s.
Пример :
FILE *files[2] = ...;
FILE *f = fwopen((void *)files, my_writefn);
// ... use f as you like ...
int my_writefn(void *cookie, const char *data, int n) {
FILE **files = (FILE **)cookie;
fwrite(data, n, 1, files[0]);
return fwrite(data, n, 1, files[1]);
}
(Обработка ошибок опущена.)
Обратите внимание, что funopen
и fwopen
относятся к BSD, а не в стандартном Linux. Я не знаю, есть ли Linux-совместимый эквивалент.
Вы можете реализовать что-то похожее на функциональность tee
с помощью boost :: iostreams .
Не уверен, что вы хотите, но «tee» в unix делает нечто подобное.