2011-11-08 8 views
0

私はクエリにgroup by句を使用しています。グループで指定されていない他の列をパラメータで取得したいこのクエリで他の列を取得する方法

SELECT un.user, un.role 
FROM [Unique] un 
group by user, role 

[ユニーク]に関するクエリでは、7つの列がすべて含まれています。他の列はどのように入手できますか?

答えて

3

(MySQLとSQLiteのは、私の知っている例外です)しない限り、あなたは、GROUP BY SELECTで列を含めることはできません。列がGROUP BY句に含まれている

  1. カラムは、サポートされている集約関数の1つにを集約したです。

MySQLとSQLiteでは、余分な値が取得される集約グループ内の行は未定義です。

あなたが他のエンジンに余分な列をしたい場合、あなたはMAXの列名をラップすることができます():この場合

SELECT un.user, un.role, MAX(un.city), MAX(un.bday) 
FROM [Unique] un 
GROUP BY user, role 

、余分な列の値が異なるから来る可能性がある入力レコードセットの行。これが重要な場合(1対多のJOINの片側から余分な列が来ることはないため)、この手法を使用することはできません。

SELECTでGROUP BYを使用すると、戻ってくる各行は、グループのうち、選択しているテーブルの複数の行から構成されます。 GROUP BY句に含まれていない列を含めると、その値を読み込むテーブルの行のの命令がエンジンに与えられません。したがって、ほとんどのエンジンでは、この種のSQLを実行することはできません。 MySQLは未定義の結果を出していますが、私は個人的にこれを行うことを悪い習慣と考えています。

+0

私はMAXを使用する必要がある理由を理解しています。ありがとう – Luke101

0

指定しましたか?

SELECT un.user, un.role, un.col3, un.col4 
FROM [Unique] un 
group by user, role 
0

余分な列を取得するには、オーダー・バイを使用する必要があります。あなたはグループのすべての列をで終わるようになります。

1

どのような基準で他の列を使用するかを選択する必要があります。同じユーザー/ロールに対して複数のエントリが存在する場合は、first/last/randomを使用しますか?他の列を集約するか、group by文に含めるかを選択する必要があります。

一部のRDBMSではこれを実行するためのデフォルトの動作が用意されていますが、問題はSQLとマークされているだけなので、該当するかどうかわかりません。ほとんどのデータベースで

0

LEFT JOINを使用してユニークに自己結合するか、SELECTGROUP BYとサブクエリします。

関連する問題