2016-10-27 6 views
1

クエリを行いたいテーブル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フィールドを指し、この例の外部キーである

*、これを行うための良い方法は何ですか?

+1

使用されるdbmsによって異なります。一部の製品は、サブクエリを他の製品より最適化する製品があります。 – jarlh

+0

私は繰り返しの意味を理解していません。 「S」で始まる姓のクラスのすべての生徒を返す場合は、クラス名を繰り返す必要はありませんか? –

+0

'GROUP BY'は重複排除を目的としたものではなく、代わりにSELECT DISTINCTを使用してください。新しいバージョンのMySQLでは無効なグループを許可していません(互換モードでない限り)。 – jarlh

答えて

2

JOINを使用した別個の

selct distinct A.* 
from A 
inner join B 
    on B.ID = A.ID 
where B.ColumnB = 'Filter' 
1

他のデータベースシステムにGROUP BYても問題はありません!彼らは、GROUP BYまたはの列全体を集計関数で書くことを強制しています。これは、この愚かなことを許すMySQLとは対照的に、である必要があります。したがって:

SELECT a.Col1,a.Col2,a.Col3... 
FROM A 
JOIN B 
ON(a.id = b.id) 
WHERE B.some_column = 'my-filter' 
GROUP BY a.Col1,a.Col2,a.Col3... 
+0

これは意味があります。私が持つことができる唯一の問題は、データベースへのアクセスを管理するJavaアプリケーションのレイヤーを変更していることで、毎瞬に照会しているテーブルのすべての列名を推測するのが難しいことです。 ORMツールでテーブルに変換されるエンティティクラスのメソッドであるため、列名は反映されている可能性があります。 – user3289695

関連する問題