Как взять минимальный 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.
Ещё пример:
В таблице 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)
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос

Для того чтобы взять минимальный id из конкретного множества SQL, можно воспользоваться оператором SELECT с функцией MIN(). Это позволит нам получить наименьший идентификатор (id) из определенного набора данных.
Пример запроса на SQL для получения минимального id из конкретного множества данных:
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';
Этот запрос вернет наименьший id для всех пользователей с именем 'John'. Помните, что вы можете изменить условие WHERE в соответствии с вашими требованиями.
Таким образом, используя функцию MIN() в SQL, вы можете легко и быстро получить минимальный id из конкретного множества данных.