Эту задачу нужно выполнять в Access с 1 запросом. Есть 3 таблицы:
address {id, address, city, postalcode, country, supplierid}supplier {supplierID, supplierName, nameid}contactname {nameid, firstname, lastname, phone}Мне нужно создать запрос, который приведет к следующей таблице:
{country, supplierNumber, supplierName, firstname, lastname, phone}
Где supplierNumber - количество компаний в конкретной стране.
Для стран с только 1 компанией поля country, supplierName, firstname, lastname, phone должны быть заполнены; с 2 и более компаниями поля country, supplierNumber должны быть заполнены.
Итак, у меня возникла простая идея использовать:
SELECT COUNT() ...
FROM ... INNER JOIN ... ON ...
HAVING COUNT() ...
GROUP BY ...
UNION
...
Но у меня было много проблем. GROUP BY требует всех полей, которые принимает SELECT из-за COUNT(); UNION требует равного количества полей в таблицах, поэтому, возможно, вторая таблица должна быть дополнена полями NULL или чем-то еще. Так что я понятия не имею, как реализовать эту задачу. Помогите, пожалуйста.
Я написал, что пытался создать запрос с описанной выше структурой, но безуспешно.
Почему голосование против? Во-первых, публиковать мою попытку бесполезно, потому что она абсолютно не работает, во-вторых, я точно описал структуру и ошибки, которые у меня были во время моей попытки. Наконец, я безуспешно искал в Интернете похожие примеры и даже не знаю принципа, по которому эта задача должна быть реализована.


Рассмотрите возможность объединения ваших таблиц уровня единиц с запросом агрегированного уровня:
SELECT a.country, agg.supplierNumber, s.supplierName, c.firstname, c.lastname, c.phone
FROM ((supplier s
INNER JOIN contact c ON c.nameid = s.nameid)
INNER JOIN address a ON s.supplierid = a.supplierid)
LEFT JOIN
(SELECT sub_a.country, COUNT(*) AS supplierNumber
FROM address sub_a
INNER JOIN supplier sub_s ON sub_a.supplierid = sub_s.supplier_id
GROUP BY sub_a.country) AS agg
ON agg.country = a.country
Ух ты, очень умная идея, и вроде бы она работает, но в итоговой таблице есть все поля для каждой страны!
Предполагая, что address.supplierid всегда заполнен действительным supplierid, а supplier.nameid всегда заполнен действительным nameid, вы можете достичь желаемого результата, используя запрос UNION, подобный следующему. Первая часть выбирает страну и поставщика / контактное лицо для стран только с одним поставщиком, вторая часть выбирает все страны с более чем одним поставщиком (страны с более чем одним адресом):
SELECT a.country, 1 AS supplierNumber, s.supplierName, c.firstname, c.lastname, c.phone
FROM (address AS a INNER JOIN supplier AS s ON a.supplierid = s.supplierid)
INNER JOIN contactname AS c ON s.nameid = c.nameid
WHERE ((a.country) In (SELECT country FROM address GROUP BY country HAVING Count(*)=1))
UNION
SELECT a.country, Count(*), Null, Null, Null, Null
FROM address AS a GROUP BY country HAVING Count(*)>1
WolfgangK, работает отлично, просто потрясающе ... Огромное Вам спасибо! Так много неявных функций в sql!
Итак, какова ваша попытка с этим?