クエリを行いたいテーブルAがあり、それは1対多のリレーションシップを通じて別のテーブルBに関連しているとします。したがって、Aは複数のBオブジェクトを持ち、各Bオブジェクトは1つのAオブジェクト。問題は、Aを照会するときに、テーブルBの列でフィルタリングする必要があることです。これを実行する最良の方法は何ですか?SQL:異なるテーブルにある列をフィルタリングする方法は?
私がJOINを使用すると、結果に繰り返しA行があります。 Aオブジェクトは多くのBオブジェクトを持つことができるので論理的です。 MySQLでは、GROUP BYを使用して重複を避けることができますが、他のデータベースシステムでは不可能です。集合関数を使用する必要があります。
私はサブクエリを使用する場合は、私はほとんどのネストされたサブクエリは行の非常に高い数値を返す可能性があるため、パフォーマンスが良いとは思わない:
SELECT * FROM A WHERE ID IN (SELECT A_ID FROM B WHERE B.some_column = 'my-filter');
Bが持っていた場合、サブクエリは、悪い見えることは、膨大な数の行が、時間/パフォーマンスの点で痛いことがあります。 A_IDがテーブルA.そう
にIDフィールドを指し、この例の外部キーである
*、これを行うための良い方法は何ですか?
使用されるdbmsによって異なります。一部の製品は、サブクエリを他の製品より最適化する製品があります。 – jarlh
私は繰り返しの意味を理解していません。 「S」で始まる姓のクラスのすべての生徒を返す場合は、クラス名を繰り返す必要はありませんか? –
'GROUP BY'は重複排除を目的としたものではなく、代わりにSELECT DISTINCTを使用してください。新しいバージョンのMySQLでは無効なグループを許可していません(互換モードでない限り)。 – jarlh