我正在整理一个系统,使用汽车显示的服务代码提供汽车维修报价。
车辆全部由同一制造商制造,服务代码不是特定于型号的,并指示哪组作业构成服务。 每个工作的价格取决于车辆的型号和安装的发动机类型。
获取必要信息涉及4个表:
查询需要从牌照中获取引擎和型号,从服务代码返回NOT NULL
的作业。然后使用从这些查询返回的值返回引擎和机箱表中这些作业的价格。
我遇到的问题是如何根据svs_codes表中哪些列保留NOT NULL
值来仅返回引擎和机箱表中的列?
我开始尝试使用左连接,但我无法获得我想要的结果。我最终向svs_codes添加了SET
列,其中包含每个代码的所有相关作业。我创建了一个存储过程,它从这个列中获取值,并CONCAT
将它们全部一起创建一个只返回列出列的新查询。
BEGIN
SET @code = (SELECT col FROM svs_codes WHERE code=svsCode);
SET @add = REPLACE(@code, ',' , '+');
SET @car = (SELECT concat(SUBSTR(vin, 4, 3), SUBSTR(engine, 1, 3)) FROM vrm WHERE vrm=regNo);
SET @s = CONCAT('SELECT ', @code, ', (', @add, ') AS total FROM svsview WHERE chassis=', (SELECT SUBSTRING(@car, 1, 3)), ' AND engine=', (SELECT SUBSTRING(@car, 4, 3)), ' LIMIT 1');
PREPARE stmt FROM @s;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END
我创建了一个运行存储过程的VIEW
。这是机箱和引擎表的JOIN
,其中每列的值都加在一起。虽然我的解决方案有效,但看起来有点希思罗宾逊。我是否完全过度复杂,是否有更好的方法?
使用每个表的示例数据进行演示并重新创建我的视图here