2017-08-14 5 views
1

は私がPersons、2つのテーブルからの行が結合を使用してサブクエリ

PERSON_IDのテーブルを持っているPERSON_NAME

Person_Vehicle_Relation

PV_IDの別のテーブル、PERSON_ID、Vehicle_IDを取得役割

私は

PV_ID、PERSON_NAME

where Vehicle_ID= 3 and Role = 'Driver'のリストを取得することが可能なクエリを構築したいです。

私は次のように参加しようとしましたが、動作しません。希望のデータを入手するにはどうすればいいですか?

Select Persons.Person_Name , Person_Vehicle_Relation.PV_ID 
from Persons 
inner join Person_Vehicle_relations on Persons.Person_ID = (select Person_ID from Person_Vehicle_relations where Vehicle_ID = 3 and Role= 'driver') 

とエラーがサブクエリが複数の値を返しメッセージ512、レベル16、状態1、行1

ました。 =、!=、<、< =、>、> =、またはサブクエリが式として使用されている場合は、これは許可されません。

+0

エラーメッセージをクリアできませんでした。サブクエリは複数の行を返します。 =は値を比較するだけです。複数の行の比較が必要な場合は、 'IN'と置き換えてください。 – Eric

+1

また、適切にタグを付けます。これはMySQLまたはSQL Serverのいずれかであり、両方にすることはできません。 – Eric

答えて

3

なぜサブクエリ/インラインビューが必要ですか?シンプルなところでうまくいくはずです。

SELECT P.Person_Name , PVR.PV_ID 
FROM Persons P 
INNER join Person_Vehicle_relations PVR 
    on P.Person_ID = PRV.Person_ID 
WHERE PVR.Vehicle_ID = 3 
    and PVR.Role= 'driver' 

サブクエリが複数の人に戻り、人のから単一PERSON_IDは、PVRから複数の人と一致することはできませんので、あなたがエラーを持っていた理由はあります。

"="の代わりに "IN"に切り替えることもできます。ジョインとwhere句は維持して実行するのが最も簡単だったようです。

通常、PK/FK関係に参加している人は、どこでまたはどこかで制限を適用します。私は一般的に、集約が必要なときには直接結合の代わりにサブクエリ/インライン・ビューを使用し、M-M関係は人為的に集計を膨張させます。 2番目のテーブルからのデータが必要ない場合は、クロス・アプライ、または存在するサブクエリも使用できます。この場合、両方のテーブルのデータが必要なので、結合が最も見えました。

+0

私はそれを得た。それは今働いている。 –

関連する問題