0

我有两张桌子:

文档类型:

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

提供的文档:

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),但是如果在数据库中有该客户和文档的条目,那么提供的日期等额外字段会被填充。因此,对于每个客户记录,我希望有 14 行,每个 doc_type 一个。其中一些行将包含特定于客户端的数据。

这样一来,在我的网格中,我就可以过滤 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 回答