Зачем двойное уточнение в SQL?
Я пишу запрос по заданию: 29. Вывести названия всех марок автомобилей, и если есть автомобили этой марки, то номер и модель.
Часть БД которая используется:
Если я использую вот такой запрос:
SELECT b."brand", c."number", c."model"
FROM "brand" b
LEFT JOIN "car" c
ON c."id" = (SELECT MIN(c2."id")
FROM "car" c2
WHERE c2."brand_id" = b."id");
То у меня для каждого из брендов возвращается одинаковая информация по автомобилям. Чинится только если я дополнительно к сравнению c.id снова проверяю модель. Почему оно не работает без дополнительной проверки? Оно же в подзапросе выбирает итак минимальный айди?
Использую Oracle.
Примеры проблемы:
Результат запроса С уточнением
SELECT TRIM(b."brand") "Марка", c."number" "Номер", TRIM(c."model") "Модель", c."id"
FROM "brand" b
LEFT JOIN "car" c
ON c."id" = (SELECT MIN(c2."id")
FROM "car" c2
WHERE c2."brand_id" = b."id")
AND c."brand_id" = b."id";
Результат запроса БЕЗ уточнения:
SELECT TRIM(b."brand") "Марка", c."number" "Номер", TRIM(c."model") "Модель", c."id"
FROM "brand" b
LEFT JOIN "car" c
ON c."id" = (SELECT MIN(c2."id")
FROM "car" c2
WHERE c2."brand_id" = b."id");
Данные таблиц:
INSERT INTO "brand" ("id", "brand") VALUES (1, 'BMW');
INSERT INTO "brand" ("id", "brand") VALUES (2, 'Hyundai');
INSERT INTO "brand" ("id", "brand") VALUES (3, 'Haval');
INSERT INTO "brand" ("id", "brand") VALUES (4, 'Kia');
INSERT INTO "brand" ("id", "brand") VALUES (5, 'Автоваз');
INSERT INTO "brand" ("id", "brand") VALUES (6, 'Lada');
INSERT INTO "brand" ("id", "brand") VALUES (7, 'Toyota');
INSERT INTO "brand" ("id", "brand") VALUES (8, 'Ford');
INSERT INTO "brand" ("id", "brand") VALUES (9, 'Niva');
-- Добавляю машины
INSERT INTO "car" ("id", "number", "region", "brand_id", "model", "category", "production") VALUES (1, 'А394УО', '116', 1, 'X5', 'хэтчбек', 'Корея');
INSERT INTO "car" ("id", "number", "region", "brand_id", "model", "category", "production") VALUES (2, 'О444АТ', '23', 2, 'Elantra', 'седан', 'Германия');
INSERT INTO "car" ("id", "number", "region", "brand_id", "model", "category", "production") VALUES (3, 'С916ХВ', '50', 4, 'Sportage', 'седан', 'Россия');
INSERT INTO "car" ("id", "number", "region", "brand_id", "model", "category", "production") VALUES (4, 'Р907ХР', '78', 2, 'Elantra', 'универсал', 'США');
INSERT INTO "car" ("id", "number", "region", "brand_id", "model", "category", "production") VALUES (5, 'У895НК', '78', 6, 'Granta', 'внедорожник', 'США');
INSERT INTO "car" ("id", "number", "region", "brand_id", "model", "category", "production") VALUES (6, 'У631УТ', '50', 6, 'Niva', 'внедорожник', 'США');
INSERT INTO "car" ("id", "number", "region", "brand_id", "model", "category", "production") VALUES (7, 'К875ВЕ', '50', 7, 'Camry', 'седан', 'США');
INSERT INTO "car" ("id", "number", "region", "brand_id", "model", "category", "production") VALUES (8, 'А131СТ', '50', 8, 'Focus', 'хэтчбек', 'Япония');
INSERT INTO "car" ("id", "number", "region", "brand_id", "model", "category", "production") VALUES (9, 'С752ЕН', '116', 8, 'Mondeo', 'седан', 'Россия');
INSERT INTO "car" ("id", "number", "region", "brand_id", "model", "category", "production") VALUES (10, 'А220СН', '116', 2, 'Tucson', 'купе', 'США');
INSERT INTO "car" ("id", "number", "region", "brand_id", "model", "category", "production") VALUES (11, 'Н350ТЕ', '78', 4, 'Sportage', 'купе', 'Япония');
INSERT INTO "car" ("id", "number", "region", "brand_id", "model", "category", "production") VALUES (12, 'К342АО', '78', 1, '5 Series', 'купе', 'Корея');
INSERT INTO "car" ("id", "number", "region", "brand_id", "model", "category", "production") VALUES (13, 'К336НУ', '77', 1, '3 Series', 'внедорожник', 'Япония');
INSERT INTO "car" ("id", "number", "region", "brand_id", "model", "category", "production") VALUES (14, 'Р407РМ', '116', 7, 'Corolla', 'седан', 'Германия');
INSERT INTO "car" ("id", "number", "region", "brand_id", "model", "category", "production") VALUES (15, 'О387АМ', '50', 1, '5 Series', 'внедорожник', 'США');
INSERT INTO "car" ("id", "number", "region", "brand_id", "model", "category", "production") VALUES (16, 'Н266ВР', '23', 1, '3 Series', 'универсал', 'США');
INSERT INTO "car" ("id", "number", "region", "brand_id", "model", "category", "production") VALUES (17, 'Н867ХЕ', '50', 6, 'Granta', 'купе', 'США');
INSERT INTO "car" ("id", "number", "region", "brand_id", "model", "category", "production") VALUES (18, 'М479СХ', '50', 4, 'Sportage', 'купе', 'Корея');
INSERT INTO "car" ("id", "number", "region", "brand_id", "model", "category", "production") VALUES (19, 'А656АС', '50', 7, 'Corolla', 'внедорожник', 'США');
INSERT INTO "car" ("id", "number", "region", "brand_id", "model", "category", "production") VALUES (20, 'К236КК', '50', 7, 'Corolla', 'внедорожник', 'Германия');
INSERT INTO "car" ("id", "number", "region", "brand_id", "model", "category", "production") VALUES (21, 'А939РХ', '50', 2, 'Elantra', 'внедорожник', 'Россия');
INSERT INTO "car" ("id", "number", "region", "brand_id", "model", "category", "production") VALUES (22, 'Т567СС', '77', 4, 'Ceed', 'универсал', 'Япония');
INSERT INTO "car" ("id", "number", "region", "brand_id", "model", "category", "production") VALUES (23, 'У208ТР', '116', 4, 'Ceed', 'универсал', 'Корея');
INSERT INTO "car" ("id", "number", "region", "brand_id", "model", "category", "production") VALUES (24, 'Т164ВА', '23', 7, 'RAV4', 'седан', 'США');
INSERT INTO "car" ("id", "number", "region", "brand_id", "model", "category", "production") VALUES (25, 'Р597ХК', '78', 7, 'Corolla', 'универсал', 'США');
INSERT INTO "car" ("id", "number", "region", "brand_id", "model", "category", "production") VALUES (26, 'А318ВХ', '23', 8, 'Focus', 'седан', 'США');
INSERT INTO "car" ("id", "number", "region", "brand_id", "model", "category", "production") VALUES (27, 'С198ТУ', '78', 7, 'RAV4', 'седан', 'Россия');
INSERT INTO "car" ("id", "number", "region", "brand_id", "model", "category", "production") VALUES (28, 'О109МВ', '116', 7, 'Corolla', 'универсал', 'Германия');
INSERT INTO "car" ("id", "number", "region", "brand_id", "model", "category", "production") VALUES (29, 'Е194НК', '23', 8, 'Kuga', 'универсал', 'США');
INSERT INTO "car" ("id", "number", "region", "brand_id", "model", "category", "production") VALUES (30, 'А427ХН', '78', 6, 'Vesta', 'универсал', 'США');
INSERT INTO "car" ("id", "number", "region", "brand_id", "model", "category", "production") VALUES (31, 'А844НЕ', '116', 8, 'Mondeo', 'седан', 'Россия');
INSERT INTO "car" ("id", "number", "region", "brand_id", "model", "category", "production") VALUES (32, 'М704МР', '116', 7, 'Corolla', 'седан', 'Германия');
Ответы (1 шт):
А принимаются ответы по типу "я бы сделал, так так как явное лучше неявного?". Если "да", то думаю ваша задача решается более простым способом и более понятным оптимизатору.
select
b."brand",
cc."model",
cc."number"
from
"brand" b left outer join (select
c."number",
c."model",
c."brand_id"
from
"car" c
where
c."id" in (select min("id") from "car" group by "brand_id")
) cc on cc."brand_id" = b."id"




