0

在下面的表结构中,TB_Vehicles 是主表,TB_Cars、TB_Bikes、TB_Cars 是卫星表,其中包含有关各个车辆的更多信息。

**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

我希望用户使用名称进行搜索。因此,当用户输入名称作为“访问”时,我的查询应该提供有关该车辆的所有信息,包括卫星表中的信息(使用 TB_Vehicles 和 TB_Scooters)。

SELECT * FROM TB_Vehicles
WHERE V_NAME = 'Access';

同样,如果用户输入“Linea”,它应该提供来自 TB_Vehicles 和 TB_Cars 表的信息。

因此,以 V_NAME 作为输入,我将从 TB_Vehicles 表中找到 V_TYPE,并使用它来确定需要加入哪个卫星表以检索更多信息。

我该怎么做呢?你能帮我查询一下吗?我是否需要使用 CASE 或 DECODE 来实现这一点?

编辑:

此处的要求是仅显示适用于该特定车辆类型的那些列。因此,当用户提供“访问”作为输入时,它应该显示 TB_Vehicles 表中的所有列,以及 TB_Scooters 表中的 V_MILEAGE。

我在想这是否可以使用 CASE 或 DECODE 来完成,其中我首先使用输入名称(V_NAME)从 TB_Vehicles 表中识别车辆的类型(V_TYPE),然后基于此 V_TYPE,我将搜索相关表并仅显示相关列。

当输入名称为“访问”时,结果应为:

V_NAME     V_ID   V_YEAR   V_TYPE    V_COLOR   V_AVAILABLE   V_MILEAGE  
Access   20     2004     Scooter   Black     No            50 

当输入名称为“i20”时,结果应为:

V_NAME     V_ID   V_YEAR   V_TYPE   V_COLOR   V_AVAILABLE   V_CAR_TYPE  
i20      60     2012     Car      Red       Yes           Sedan
4

2 回答 2

1

您不应该将名称存储在车辆表和子表中。如果这是常见信息,则只需将其存储在车辆表中。所有常见的列都是如此。

接下来,当您访问数据时,将所有表放在一起:

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的字段仅在一个表中。

于 2013-09-11T03:25:26.037 回答
0

谢谢戈登!感谢您对此的帮助...对于其他有类似疑问的人,请查看 Gordon 的上述回复以及以下链接: http ://www.orafaq.com/forum/t/189451/180198/

于 2013-09-12T13:02:32.043 回答