0

私は2つのテーブルを持っています:

doc_types:

doc_id | doc_name | expiry_days
-------|----------|-------------
  1    | Doc_1    |    365
  2    | Doc_2    |    90
  3    | Doc_3    |    30

docs_supplied:

evidence_id | doc_id  | client_id |  date_supplied
------------|---------|-----------|-----------------
       1    | 1       |    5432   |   13-05-2012
       2    | 1       |    3165   |   25-04-2011
       3    | 2       |    5432   |   23-10-2011

私が見たい出力は次のとおりです。

   doc_id | doc_name | expiry_days | client_id |  date_supplied
   -------|----------|-------------|-----------|----------------
     1    | Doc_1    |    365      |    5432   |  13-05-2012
     2    | Doc_2    |    90       |    5432   |  NULL    
     3    | Doc_3    |    30       |    5432   |  NULL
     1    | Doc_1    |    365      |    3165   |  25-04-2012
     2    | Doc_2    |    90       |    3165   |  NULL    
     3    | Doc_3    |    30       |    3165   |  NULL

基本的に、クライアントごとに、ドキュメントの完全なリスト (14) を表示したいのですが、DB にそのクライアントとドキュメントのエントリがある場合は、提供された日付などの追加フィールドが入力されています。したがって、クライアント レコードごとに、doc_type ごとに 1 つずつ、合計 14 行あると予想されます。これらの行の一部には、クライアント固有のデータが含まれています。

これは、私のグリッドで client_id に対してフィルタリングするだけで、すべてのドキュメントのリストとその人物のステータスを確認できるようにするためです。

これは可能ですか?

4

1 に答える 1

2
SELECT   doc_types.*, client_id, date_supplied
FROM     doc_types
   CROSS JOIN (SELECT DISTINCT client_id FROM docs_supplied) AS clients
   LEFT  JOIN docs_supplied USING (client_id, doc_id)
ORDER BY client_id DESC, doc_id

sqlfiddleで参照してください。

一意の列を持つテーブルがある場合は、サブクエリclient_idから生成する代わりに、単純にそれを使用できます。SELECT DISTINCT

SELECT   doc_types.*, client_id, date_supplied
FROM     doc_types
   CROSS JOIN client_accounts
   LEFT  JOIN docs_supplied USING (client_id, doc_id)
ORDER BY client_id DESC, doc_id

SQL 結合について学習します。

于 2012-05-24T09:32:53.887 に答える