присоединяется даст вам дубликаты, потому что они включают в себя более чем одна таблица, представляющая отношение «многие ко многим», и фильтрация недостаточно для того, чтобы предотвратить переключение таблиц «многие ко многим» на несколько строк на основе данных условий соединения.
Вы можете избежать дубликатов, введя полусоединение в виде предиката EXISTS и последующего перемещения некоторых из таблиц. Вот один из возможных способов использования EXISTS в вашей ситуации:
SELECT
stores.state,
SUM(qty * price)
FROM sales
INNER JOIN stores ON sales.stor_id = stores.stor_id
INNER JOIN titles ON sales.title_id = stores.title_id
WHERE EXISTS (
SELECT *
FROM authors a
INNER JOIN titelauthor ta ON a.au_id = ta.au_id
WHERE ta.titel_id = titles.title_id
AND a.state LIKE stores.state
)
GROUP BY
stores.state
Центральная таблица, скорее всего, sales
, это где цифры берутся. Поэтому запрос строится вокруг sales
. Другие таблицы объединены явно (с использованием предложения JOIN), пока они возвращают только одну строку для каждой строки sales
. Когда таблица вернется более чем к одной строке, она будет перенесена в EXISTS.
Есть еще одна вещь. Во время работы над этим запросом я заметил, что одно соединение может быть избыточным (как в вашем запросе, так и в моем). Таблица titles
. Если ваши внешние ключи в порядке, вам не нужно присоединяться к titles
, так как titleauthor
может быть подключен непосредственно к stores
по адресу title_id
. (Даже если у вас нет соответствующих внешних ключей, вы не должны включать в себя titles
, так как любые возможные несуществующие названия, на которые ссылается либо titleauthor
или sales
будут отфильтрованы в любом случае.)
Так окончательный запрос может выглядеть так:
SELECT
stores.state,
SUM(qty * price)
FROM sales
INNER JOIN stores ON sales.stor_id = stores.stor_id
WHERE EXISTS (
SELECT *
FROM authors a
INNER JOIN titelauthor ta ON a.au_id = ta.au_id
WHERE ta.titel_id = sales.title_id
AND a.state LIKE stores.state
)
GROUP BY
stores.state
Если вы удалите DISTINCT, какой результат вы получите? –
В основном то же самое, что я получил здесь, только с дубликатами –
Это важные для вас «дубликаты»; если вы добавите идентификаторы продаж в оператор select, вы, вероятно, обнаружите, что в большинстве случаев они представляют разные продажи. Другими словами, общая стоимость продаж для калифорнийских авторов почти наверняка значительно больше, чем около 1703 долл. США, которую вы могли бы получить от суммирования отдельных значений выше. –