想象一下有两个表-车辆和;制造商。
车辆(Id[PK],制造商_Id[FK],名称,价格,折扣)
制造商(Id[PK],名称)
如果我想更新制造商名称为"宝马"的所有车辆。
我笨拙的方式。。。
"SELECT Id FROM Manufacturers WHERE Name = 'BMW'";
一旦我有了制造商Id,我就可以运行更新查询。
UPDATE Vehicles SET Discount='0.1' WHERE Manufacturer_Id='$manuId'
我正在寻找一个更优雅的解决方案,通过它我可以在更新语句中引用"宝马",并取消选择查询。
我想做这样的事。。。如果可能:
UPDATE Vehicles SET Discount='0.1' WHERE Vehicles.Manufacturer_Id = Manufacturer.Id AND Manufacturer.Name = 'BMW'
类似这样的查询应该可以工作:
UPDATE Vehicles SET Discount='0.1' WHERE Manufacturer_Id IN (SELECT Id FROM Manufacturers WHERE Name = 'BMW'")
UPDATE Vehicles SET Discount='0.1' WHERE Manufacturer_Id IN
(SELECT id FROM Manufacturers WHERE Name = 'BMW');
简单的答案是子选择,但通常子选择对性能不好。在这种情况下,假设OK。如果需要经常使用制造商密钥对(id-name)、填充选择、在显示时从名称中获取id等。使用身份映射模式(假设有OOP的外观)并另外使用memcache之类的缓存策略来减少更多的数据库访问可能是有意义的。