基于依赖列值的SQL嵌套查询
在下表结构中,TB_车辆是主表,TB_汽车、TB_自行车、TB_汽车是附属表,其中包含有关各自车辆的更多信息基于依赖列值的SQL嵌套查询,sql,join,case,decode,Sql,Join,Case,Decode,在下表结构中,TB_车辆是主表,TB_汽车、TB_自行车、TB_汽车是附属表,其中包含有关各自车辆的更多信息 **TB_Scooters** V_NAME V_ID V_YEAR V_TYPE V_MILEAGE Activa 10 2003 Scooter 45 Access 20 2004 Scooter 50 **TB_Bikes** V_NAME V_ID V
**TB_Scooters**
V_NAME V_ID V_YEAR V_TYPE V_MILEAGE
Activa 10 2003 Scooter 45
Access 20 2004 Scooter 50
**TB_Bikes**
V_NAME V_ID V_YEAR V_TYPE V_ENGINE
Karizma 30 2001 Bike 180
Pulsar 40 2008 Bike 150
**TB_Cars**
V_NAME V_ID V_YEAR V_TYPE V_CAR_TYPE
Linea 50 2011 Car Sedan
i20 60 2012 Car Sedan
**TB_Vehicles**
V_NAME V_ID V_YEAR V_TYPE V_COLOR V_AVAILABLE
Activa 10 2003 Scooter Black Yes
Access 20 2004 Scooter Black No
Karizma 30 2001 Bike Red Yes
Pulsar 40 2008 Bike Black Yes
Linea 50 2011 Car White No
i20 60 2012 Car Red Yes
我希望用户使用该名称进行搜索。因此,当用户输入Name作为“Access”时,我的查询应该给出关于该车辆的所有信息,包括来自卫星表的信息(同时使用TB_车辆和TB_踏板车)
同样,如果用户输入“Linea”,则应提供TB_车辆和TB_车辆表中的信息
因此,使用V_名称作为输入,我将从TB_Vehicles表中查找V_类型,并使用它,我需要确定我需要加入哪个附属表以检索更多信息
我该怎么做?你能帮我查询一下吗?我需要使用用例还是解码来实现这一点
编辑:
此处的要求是仅显示适用于该特定车型的列。所以,当用户提供“访问”作为输入时,它应该显示TB_Vehicles表中的所有列,以及TB_Scooters表中的V_里程
我在考虑是否可以使用CASE或DECODE来完成此操作,首先使用输入名称(V_name)从TB_车辆表中识别车辆的类型(V_type),然后基于此V_类型,我将搜索相关表并仅显示相关列
当输入名称为“Access”时,结果应为:
V_NAME V_ID V_YEAR V_TYPE V_COLOR V_AVAILABLE V_MILEAGE
Access 20 2004 Scooter Black No 50
V_NAME V_ID V_YEAR V_TYPE V_COLOR V_AVAILABLE V_CAR_TYPE
i20 60 2012 Car Red Yes Sedan
当输入名称为“i20”时,结果应为:
V_NAME V_ID V_YEAR V_TYPE V_COLOR V_AVAILABLE V_MILEAGE
Access 20 2004 Scooter Black No 50
V_NAME V_ID V_YEAR V_TYPE V_COLOR V_AVAILABLE V_CAR_TYPE
i20 60 2012 Car Red Yes Sedan
您不应该将名称同时存储在vehicles表和子表中。如果这是常见信息,则只需将其存储在vehicles表中即可。所有公共列都是如此 接下来,在访问数据时,将所有表放在一起:
select v.*,
s.v_mileage, b.v_engine, c.v_car_type
from TB_vehicles v left join
TB_Scooters s
on s.v_id = v.v_id and v.type = 'scooter' left join
TB_Bikes b
on b.v_id = v.v_id and v.type = 'bike' left join
TB_Cars c
on c.v_id = v.vid and v.type = 'car';
从该查询中,您可以选择所需的行和字段
但是,您需要对数据结构进行规范化,以便像
v_year
这样的字段只在一个表中。谢谢Gordon!感谢你在这方面的帮助。。。
对于其他有类似疑问的人,请查看Gordon的上述回复以及以下链接:
谢谢@Gordon根据您的建议,我尝试了以下查询:选择v.*、s.v_里程、b.v_引擎、,c.v_-car_type FROM tb_vehicles v LEFT JOIN tb_scooters s ON s.v_id=v.v_id和v.v_type='Scooter'LEFT JOIN tb_bikes b ON b.v_id=v.v_id和v.v_type='Bike'LEFT JOIN tb_cars c ON c.v_id=v_id和v.v_type='car其中v_name='Access';但是,此处的要求是仅显示适用于该特定车型的列。所以,当我将“访问”作为输入时,它应该显示TB_车辆的所有列,以及TB_踏板车的v_里程。另外,我没有为这个创建任何临时表或视图的选项。我在考虑是否可以使用CASE或DECODE来完成此操作,首先使用V_NAME从TB_车辆表中识别车辆类型,然后根据此V_类型,搜索相关表并显示其他列。请告诉我。@NiCKz。不能使用常规SQL更改结果集的结构。列的数量和名称由
SELECT
语句固定。您可以将NULL
值分配给未使用的字段。或者使用通用名称。你应该用你想要的输出的例子来修改你的问题。我已经修改了我的问题。我不确定我是否能清楚地提出要求。请调查一下。。。您不能使用基本SQL执行您想要的操作。select
语句定义要返回的列;它们不能根据查询的参数更改名称或类型。最好是返回所有列,用NULL
填充未使用的列。