Запишите simultaneousely в два потока

Проблема с вашим запросом состоит в том, что при использовании предложения 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, важно использовать только функцию, которая возвращает значение столбец, если есть только одна подходящая строка.

5
задан jackhab 25 June 2009 в 13:01
поделиться

4 ответа

Первое, что мне пришло в голову, тоже было «тройник». Итак, давайте объединим 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.

4
ответ дан 18 December 2019 в 10:48
поделиться

Используйте 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-совместимый эквивалент.

7
ответ дан 18 December 2019 в 10:48
поделиться

Вы можете реализовать что-то похожее на функциональность tee с помощью boost :: iostreams .

1
ответ дан 18 December 2019 в 10:48
поделиться

Не уверен, что вы хотите, но «tee» в unix делает нечто подобное.

2
ответ дан 18 December 2019 в 10:48
поделиться
Другие вопросы по тегам:

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