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

Ссылка скопирована
1 ответ

Таблица 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.
Ещё пример:

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

В таблице 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));

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 на минимальные.
Надеюсь смог понятно объяснить суть вопроса.

Дополнительно:

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

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

  • Спасибо за ответ. Уточните пожалуйста, для чего нужен второй join? Если он группирует по маркам машины, то для чего тогда нужен первый join? Разве второй уже не гарантирует, что Car.car_id = Human.car_id?
  • Microsoft SQL Server 2019 (RTM-CU15) (KB5008996) - 15.0.4198.2 (X64)

    Microsoft SQL Server 2019 (RTM-CU15) (KB5008996) - 15.0.4198.2 (X64)

    Сообщение 156, уровень 15, состояние 1, строка 2 Неправильный синтаксис около ключевого слова "JOIN". Сообщение 156, уровень 15, состояние 1, строка 7 Неправильный синтаксис около ключевого слова "AS".

    Сообщение 156, уровень 15, состояние 1, строка 2 Неправильный синтаксис около ключевого слова "JOIN". Сообщение 156, уровень 15, состояние 1, строка 7 Неправильный синтаксис около ключевого слова "AS".

  • Константин Цветков, да там нужно добавить from просто. Но не понимаю для чего два join'a
  • PyotR3213ty54, Первое соединение получает модель машины, второе получает минимальный код для неё из подзапроса.

Ответы:

-- Обновление минимальным кодом: 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)

-- Обновление минимальным кодом: 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)

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Юрий Linux Ответ

Для того чтобы взять минимальный id из конкретного множества SQL, можно воспользоваться оператором SELECT с функцией MIN(). Это позволит нам получить наименьший идентификатор (id) из определенного набора данных.

Пример запроса на SQL для получения минимального id из конкретного множества данных:

SELECT MIN(id) AS min_id
FROM TABLE_NAME
WHERE condition = 'value';

SELECT MIN(id) AS min_id FROM table_name WHERE condition = 'value';

В данном запросе:
- MIN(id) - функция, которая возвращает минимальное значение столбца id.
- AS min_id - дает псевдоним для результирующего столбца с минимальным id.
- table_name - название таблицы, в которой находятся данные.
- condition = 'value' - условие, по которому выбираются данные из таблицы.

Например, если у нас есть таблица users с полями id и name, и нам нужно получить минимальный id для пользователей с определенным именем, то запрос будет выглядеть следующим образом:

SELECT MIN(id) AS min_id
FROM users
WHERE name = 'John';

SELECT MIN(id) AS min_id FROM users WHERE name = 'John';

Этот запрос вернет наименьший id для всех пользователей с именем 'John'. Помните, что вы можете изменить условие WHERE в соответствии с вашими требованиями.

Таким образом, используя функцию MIN() в SQL, вы можете легко и быстро получить минимальный id из конкретного множества данных.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно