Я очень новичок в PL / SQL, но я хотел бы заполнить пустое поле для всех записей в таблице на основе значений нескольких полей в заданной строке. Итак, логика, которую я хотел бы изложить, такова, но есть несколько вещей, о которых мне нужно помнить при настройке стола для автосалона ...
Сначала сгруппируйте по отдельным used_car_ids, затем обновите столбец на основе .....
Если столбец used_car_id равен new_car_id, но drive_mode равно 1, а saftey_rating равно 2, тогда установите для столбца Parking_Spot значение 2 или доступный последовательный номер Parking_Spot.
Если столбец used_car_id равен new_car_id, но drive_mode равно 2, а saftey_rating равно 1, тогда установите для столбца Parking_Spot значение 3 или следующий доступный номер Parking_Spot.
Если случай с наивысшим приоритетом не выполняется, он должен рассматривать 2 варианта использования как наивысший и помещать его как Parking_Spot = 1.
Это небольшая картинка того, что я хотел бы в идеале. Итак, как вы можете видеть на картинке, номер парковочного места равен 1 и 2, в зависимости от того, равны ли used_car_id, new_car_id, drive_mode и safety_rating 1 и 2, но как только used_car_id и new_car_id отличаются, количество парковочных мест увеличивается до 3 и 4. .
Я предполагаю, что мне нужна функция для ввода 4 параметров, и на основе этих полей я возвращаю число как место для парковки. Но я все еще не уверен, как это сделать. Любая помощь будет оценена по достоинству. Спасибо.
Пометьте правильно !!!! Если это Oracle, почему я вижу тег MySQL в вашем вопросе ???
Извините, пожалуйста, потерпите меня. Я не знал, что PL / SQL предназначен только для Oracle. Это база данных MySQL. Я только что отредактировал название вопроса и теги. Спасибо всем за то, что указали на это.






Из ваших тегов неясно, используете ли вы базу данных Oracle или MySQL. Этот ответ предполагает первое.
В вашем вопросе есть пара пробелов, но похоже, что вы хотите дать каждой строке последовательный номер на основе drive_mode и safety_rating. Вы упоминаете "used_car_id column is equal to the new_car_id" несколько раз, но никогда не упоминаете, что вы хотите сделать, когда они не равны.
Что касается написанного вопроса, кажется, что его можно решить довольно просто с помощью аналитических функций. В этом случае мы просто скажем функции упорядочить строки по drive_mode_id и safety_rating и присвоить каждой строке из результирующего порядка порядковый номер:
SELECT id,
used_car_id,
new_car_id,
car_features_id,
drive_mode_id,
safety_rating,
ROW_NUMBER () OVER (ORDER BY drive_mode, safety_rating)
AS parking_spot
FROM your_table
WHERE used_car_id = new_car_id
Похоже, что MySQL поддерживает аналитические функции (также известные как оконные функции) начиная с версии 8.0.2, поэтому указанное выше решение должно работать, если вы используете эту версию или более позднюю (в противном случае может помочь этот ответ).
Чтобы обновить это, чтобы также рассматривать used_car_id = new_car_id как условие сортировки, вам нужно добавить условие в ORDER BY:
SELECT id,
used_car_id,
new_car_id,
car_features_id,
drive_mode_id,
safety_rating,
ROW_NUMBER ()
OVER (
ORDER BY
CASE WHEN used_car_id = new_car_id THEN 1 ELSE 2 END,
drive_mode,
safety_rating)
AS parking_spot
FROM your_table
Это не проверено, поэтому я не могу гарантировать, что это полностью синтаксически правильно, но это должно быть близко.
Спасибо за ответ, Аллан, я использую базу данных Mysql. Мне очень жаль, что я хотел затронуть еще один вопрос. Если used_car_id и new_car_id не равны, то их следует рассматривать как более низкий приоритет по сравнению с теми, которые равны. Итак, если есть строка с
Спасибо за ответ, Аллан, я использую базу данных Mysql. Мне жаль, что я хотел упомянуть об этом. Но если used_car_id и new_car_id не равны, тогда их следует рассматривать как более низкий приоритет по сравнению с теми, которые равны. Итак, если есть строка, в которой и used_car_id, и new_car_id равны, несмотря на значения других столбцов, и она должна иметь меньшее значение Parking_Spot, чем те, которые не равны. Я думал, что мне нужно заказать по Parking_Spots и groupBy по drive_mode. Но мне нравится этот подход, за исключением того, что он не может быть скомпилирован в Workbench, вы можете мне помочь?
Есть ли версия Mysql для этого запроса, поскольку в Mysql нет таких функций, как ROW_NUMBER или OVER, которые вызывают ошибки.
Я связался с другим вопросом, касающимся эмуляции этой функции в ответе.
Таким образом, используется версия Mysql 5.7, так что эта версия должна была быть выпущена несколько месяцев назад. Так что, если бы мне пришлось придерживаться синтаксиса MySQL 5.7. Есть ли способ воспроизвести эту функцию, или мне придется вместо этого использовать pl / sql в моей ситуации?
@ user3116769 Разве это не бесполезно, если вы не помечаете правильно ??? Поскольку вы указываете PL/SQL в своем названии, люди предполагают, что вы используете Oracle. Теперь кто-то дает вам решение для Oracle, и вы не можете его использовать. Вы просто зря тратите время !!!
@Eric: Мои извинения, я использую сервер MySQL 5.7, и я не знал, что PL / SQL является эксклюзивным только для OracleSQL. Для меня это немного в новинку. Пожалуйста, поймите.
Кроме того, как я уже упоминал выше, в ответ я включил ссылку на вопрос о репликации функции row_number в MySQL. И снова: stackoverflow.com/questions/1895110/row-number-in-mysql
PL / SQL - это язык процедурной части базы данных Oracle, но у вас есть теги mysql. Что вы на самом деле используете?