【问题标题】:Query is really annoying me I can't get my head around it查询真的很烦我,我无法理解它
【发布时间】:2015-12-16 10:54:03
【问题描述】:

我是 SQL 新手,我有以下 erd:

我要执行的查询是: 多少车辆可用于服务货物 x?|

有什么想法吗?? 我有:

select count(VehicleType) from Vehicle where in
 (select VEHICLETYPE, SHIPMENT_TYPE from can_carry
 where SHIPMENT_TYPE in
 (select SHIPMENT_TYPE from Shipment where ContractNo = x and ShipmentNo = x  );

但我觉得不对

【问题讨论】:

  • 在 WHERE 和 IN 之间缺少某些东西。 (根据 SQL 验证器,developer.mimer.com/validator/parser200x/.
  • 你不能在 can_carry 桌子上数一数吗?有点像这样select count(VEHICLETYPE) from can_carry where can_carry.SHIPMENT_TYPE in (select SHIPMENT_TYPE from Shipment where ContractNo = x and ShipmentNo = x )

标签: sql select join erd


【解决方案1】:

您在第一种情况下没有 VEHICLETYPE 并且缺少一个 )。 所以这是有效的有效 SQL:

select count(VehicleType) from Vehicle where VEHICLETYPE in
(select VEHICLETYPE, SHIPMENT_TYPE from can_carry
 where SHIPMENT_TYPE in
 (select SHIPMENT_TYPE from Shipment where ContractNo = x and ShipmentNo = x))

但是这个 SQL 是 PERFKILLER! :) 我的意思是你选择了3组结果!所以这将有一个可怕的执行计划。 您可以使用JOIN 编写更好的查询。更多关于执行计划here

【讨论】:

  • 感谢您考虑使用连接,但我不确定它是否类似于 select count(VehicleType) from Vehicle join can_carry using (VehicleType), join Shipment using (SHIPMENT_TYPE) where ContractNo = x 和 ShipmentNo = x ;但这似乎太容易了?
  • 是的,你可以通过join来写。如果我有时间,我会尝试并插入以回答正确的查询;)但我现在很着急。
  • 如果我能提供建议,请阅读执行计划。如果开发人员编写了糟糕的 SQL,这将是未来的真正问题。如果您在数据库中有大量数据并且您正在运行这样的查询,那么您将遇到连接池和超时等问题......真的很糟糕:)相信我:)))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-10
  • 2016-01-25
  • 1970-01-01
  • 1970-01-01
  • 2020-08-07
  • 2020-12-02
  • 1970-01-01
相关资源
最近更新 更多