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

ユーザーに名前を使用して検索してもらいたい。そのため、ユーザーが Name に「Access」と入力すると、クエリは、サテライト テーブル (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 を使用する必要がありますか?

編集:

ここでの要件は、その特定の車両タイプに適用可能な列のみを表示することです。したがって、ユーザーが入力として「Access」を指定すると、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

vehicle テーブルとサブテーブルの両方に名前を格納するべきではありません。これが一般的な情報である場合は、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は 1 つのテーブルにのみ含まれます。

于 2013-09-11T03:25:26.037 に答える