2011-07-28 15 views
2

私は質問に頭を抱えてしまいました。文書の行列であり、彼らは何にも適用位置私は(私の要求された結果)を取得しようとしています何SQLクエリのヘルプ(PostgreSQL)

documents (
    id, 
    title 
); 

positions (
    id, 
    title 
); 

documents_positions (
    document_id, 
    position_id 
); 

:私は、次の3つのテーブルを持っています。したがって、各行はドキュメントタイトルを持ち、その位置がドキュメントに適用される場合、TrueまたはFalseで各位置とその横の列に列を持ちます。ドキュメントの後の各行には、ポジションテーブルのすべてのポジションとそのドキュメントがそのポジションに適用されるかどうかをリストしたいので、LEFT JOINのいくつかの種類が必要と思われます。理にかなっている?

+1

入力データと予想結果データを提供できますか? – Bohemian

答えて

1

あなたは満たされているマトリックス内の位置を見つけるために、マトリックスを構築するためにcross joinを使用して、left joinできます

select d.title 
,  p.title 
,  case when dp.document_id is null then 'hrmm' else 'HALLELUJAH' end 
from documents d 
cross join 
     positions p 
left join 
     documents_positions dp 
on  dp.document_id = d.id 
     and dp.position_id = p.id 
+0

これは私に正しいデータを与えますが、各位置がドキュメントと同じ行にある出力をどのようにすることができますか? – Pyrite

+0

@Pyrite:これは「ピボット」と呼ばれています。 Excelは、あなたや他の多くのレポートツールのためにそれを行うことができます。 SQLでは可変数のカラムが気に入らないため、純粋なSQLでは不可能にすることはできません。 – Andomar

+0

私は、Postgresqlで結果をPIVOTする方法を言うと思いますか? – Pyrite

1

あなたが列にpositions行をオンにしたいので、あなたが「ピボット」に持っていますそれら。 PostgreSQLでは、これはcrosstabの機能で行われます。ただし、crosstabは、positionsの行数が変更される可能性があるため、クエリで出力列の数を定義する必要があるようです。 私はPostgreSQLのユーザではありませんので、わからない動的クエリを作成するにはいくつかのトリックがありますが、Andomarのようなクエリを使用してクライアントコードの行をピボットするのが簡単なようです...

+0

あなたはこの前提で正しいです。 – Pyrite