Задать вопрос
@PyotR3213ty54

Как взять минимальный id из конкретного множества SQL?

Таблица Car - родительская таблица. Таблица Human - дочерняя (внешний ключ car_id таблицы Human ссылается на car_id таблицы Car).
В таблице Car есть 2 поля: car_id (int) и model (varchar). В model хранятся марки автомобилей. Но эти марки повторяются, т.е. машина к примеру Huinday может иметь id 1 и 5. А два человека из таблицы Human в поле car_id могут иметь значения 1 и 5. То есть у этих разных людей марки автомобиля одинаковый (Huinday), но car_id у них разные.
Я хочу, чтобы теперь этот car_id стал единым и не было путаницы. Т.е. если у человека Huinday, то в его поле будет только car_id=1. Если еще у кого-то Huinday, то и у него тоже будет car_id = 1, а не 5.
Ещё пример:
62248c4610180724896490.png
В таблице Car есть повторяющиеся автомобили: LADA (2 раза)и BMW (3 раза).
В таблице Human люди с id 3005, 3006, 3007 имеют одинаковые марки автомобилей (car_id = 7,4,1, это всё BMW).
А должны иметь car_id единый, т.е. car_id = 1 (это BMW) у id=3005,3006,3007.
То есть из таблицы Car удалить ненужные car_id, если уже этот автомобиль встречался ранее.

Аналогично люди с id = 3002, 3004 с марками LADA. (car_id у LADA = 3 и 6 из таблицы Car)
После выполнения запроса у id=3002 car_id должен остаться 3, а у человека с id=3004 должен стать тоже car_id = 3, а не 6

Запрос для субд Microsoft SQL Server.
Я написал запрос, но он заменяет все car_id на единицу (как минимальный)
Я написал запрос, который должен обновить таблицу Human, изменив там поле car_id на минимальный из своего типа (ну т.е. если это LADA, то минимальный из набора 3, 6).
Однако он заменяет ВСЕ car_id в таблице Human на 1:
update Human set car_id = (
  select min(car_id) from Car c where c.Model in (
    select Model from Car inner join Human on Human.car_id= Car.car_id));

Обновляем таблицу Human car_id равным минимальному car_id из таблицы Car где модель машины из таблицы Car находится в множестве (выбрать марку машины из таблицы Car, объединив с Human по общему полю car_id).
В итоге выводится таблица со ВСЕМИ марками и их id. А не конкретно одна модель. Он соответственно и берет по порядку самую первую (у которой car_id = 1) и обновляет все поля и ставит им car_id = 1.
Как исправить этот запрос, чтобы он брал конкретно набор из car_id для LADA, BMW?
Если перефразировать, то вопрос заключается в том, как удалить дубликаты из родительской таблицы Car, на которые ссылаются поля дочерней таблицы Human по внешнему ключу car_id. То есть нужно сначала изменить car_id из дочерней таблицы на какой-то один минимальный из соответствующего комплекта, а затем просто удалить ненужные из родительской таблицы. Но у меня вопрос именно как изменить car_id на минимальные.
Надеюсь смог понятно объяснить суть вопроса.
  • Вопрос задан
  • 348 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
UPDATE Human
  JOIN Car ON Car.car_id = Human.car_id
  JOIN (
    SELECT model, MIN(car_id) AS car_id
      FROM Car
      GROUP BY model
  ) AS c ON c.model = Car.model
  SET Human.car_id = c.car_id
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
tsklab
@tsklab Куратор тега SQL Server
Здесь отвечаю на вопросы.
-- Обновление минимальным кодом:
UPDATE Human
  SET car_id = UniqCar.min_id
  FROM Human 
    INNER JOIN Car ON Human.car_id = Car.car_id 
    INNER JOIN (SELECT MIN(car_id) AS min_id, model
                  FROM Car AS CarMini
                  GROUP BY model) AS UniqCar ON UniqCar.model = Car.model
-- Удаление лишних машин:
DELETE FROM Car
 WHERE Car.car_id <> (SELECT MIN(CarOff.car_id) FROM Car AS CarOff WHERE CarOff.model = Car.model)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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