想象一下有两张桌子 - 车辆和厂家。
车辆(Id [PK],制造商_Id [FK],姓名,价格,折扣)
制造商(Id [PK],姓名)
如果我想更新制造商名称为“宝马”的所有车辆。
我笨重的方式......
"SELECT Id FROM Manufacturers WHERE Name = 'BMW'";
一旦我拥有制造商ID,我就可以运行更新查询。
UPDATE Vehicles SET Discount='0.1' WHERE Manufacturer_Id='$manuId'
我正在寻找的是一个更优雅的解决方案,我可以在更新声明中以某种方式引用“BMW”,并取消选择查询。
e.g。我想做这样的事情......如果可能的话:
UPDATE Vehicles SET Discount='0.1' WHERE Vehicles.Manufacturer_Id = Manufacturer.Id AND Manufacturer.Name = 'BMW'
答案 0 :(得分:2)
这样的查询应该有用:
UPDATE Vehicles SET Discount='0.1' WHERE Manufacturer_Id IN (SELECT Id FROM Manufacturers WHERE Name = 'BMW'")
答案 1 :(得分:1)
UPDATE Vehicles SET Discount='0.1' WHERE Manufacturer_Id IN
(SELECT id FROM Manufacturers WHERE Name = 'BMW');
答案 2 :(得分:0)
简单回答是子选择,但一般来说,子选择不利于性能。假设在这种情况下确定。如果需要经常使用制造商密钥对(id-name),填充选择,在显示时从名称获取id等等。使用身份映射模式(假设有一些OOP的外观)并另外使用诸如memcache之类的东西可能是有意义的为您提供缓存策略,以便在访问数据库时减少更多。