Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于依赖列值的SQL嵌套查询_Sql_Join_Case_Decode - Fatal编程技术网

基于依赖列值的SQL嵌套查询

基于依赖列值的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_车辆是主表,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_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
填充未使用的列。