Я объединяю две таблицы вместе, и я хочу перечислить только те строки, в которых количество сгруппированных строк не соответствует значению частей таблицы A.
table A
id name pieces
1 name_1 6
2 name_2 2
table B
a_id
1
1
2
2
Итак, я хочу получить все a.name, где a.piece <> количество сгруппированных строк. что-то вроде этого:
SELECT a.name
FROM a
INNER JOIN b
ON a.id = b.a_id
WHERE a.pieces <> Count(*)
GROUP BY id
это приводит к недопустимому использованию групповой функции
также пробовал это:
SELECT a.name,
Count(*) AS count
FROM a
INNER JOIN b
ON a.id = b.a_id
WHERE a.pieces <> count
GROUP BY id
error: unknown column 'count'
В этом случае, как результат, я хочу получить только 1 строку, например:
name count
name_1 2
Поскольку name_1 имеет 2 сгруппированных строки из table.b, и он не соответствует a.piece, равному 6.






Вы можете использовать MAX() на pieces, поскольку это только скалярное значение, это не будет иметь значения. Это также сделает запрос совместимым с режимом only_full_group_by.
SELECT a.id, a.name, COUNT(*) AS count
FROM a
INNER JOIN b
ON a.id = b.a_id
GROUP BY a.id, a.name
HAVING MAX(a.pieces) <> COUNT(*)
Вы можете мне сказать, что такое only_full_group_by?
@ Ninet9 проверьте этот ответ: stackoverflow.com/a/41887524/2469308
Спасибо. Меня устраивают эти строгие правила.
@ Ninet9 да, вам следует использовать строгий режим, так как это правильный способ и соответствует стандарту ANSI
Вы можете агрегировать данные из tableb и объединить их с tablea:
SELECT tablea.name
FROM tablea
INNER JOIN (
SELECT a_id, COUNT(*) AS c
FROM tableb
GROUP BY a_id
) AS groupedb ON tablea.id = tableb.a_id
WHERE tablea.pieces <> groupedb.c
Вместо! == я хотел написать <>, но stackoverflow не показывал эту комбинацию символов