将两次链接到同一个表

时间:2018-05-17 16:49:33

标签: sql hsqldb

背景 我正在建立一个图片数据库来管理我制作的所有照片。我有很多RAW文件(底片)和很多JPG文件(副本)。大多数JPG是RAW文件的编辑版本,但是一些JPG没有一个同步的RAW文件(例如我用智能手机拍摄的照片)。 因此,图片可以包含单个JPG文件或JPG以及相应的RAW文件。

我想明确区分两种情况:

  1. JPG没有RAW文件(例如智能手机)
  2. 照片有一个RAW文件,但我还没有在备份中找到它。
  3. 这就是我的数据库目前的样子:

    SELECT * FROM pictures
    *------*------------*------------*--------*
    | p_id | p_complete | p_negative | p_copy |
    *------*------------*------------*--------*
    | 1    | true       | 1          | 2      |
    | 2    | true       | null       | 3      |
    | 3    | false      | null       | 4      |
    *------*------------*------------*--------*
    
    SELECT * FROM files
    *------*--------*
    | f_id | f_path |
    *------*--------*
    | 1    | a.raw  |
    | 2    | a.jpg  |
    | 3    | b.jpg  |
    | 4    | c.jpg  |
    *------*--------*
    

    我想要的是构建一个查询来获取所有图片。结果应该是:

    *----*----------*----------*-------*
    | id | complete | negative | copy  |
    *----*----------*----------*-------*
    | 1  | true     | a.raw    | a.jpg |
    | 2  | true     | null     | b.jpg |
    | 3  | false    | null     | c.jpg |
    *----*----------*----------*-------*
    

    我尝试了什么:

    SELECT p_id as id,
           p_complete as complete,
           f1.f_path as negative,
           f2.f_path as copy
    FROM pictures as p,
         files as f1,
         files as f2
    WHERE ((f1.f_id = p.p_negative) OR (p.p_negative=null)) AND
          f2.f_id = p.p_copy
    

    结果是:

    *----*----------*----------*-------*
    | id | complete | negative | copy  |
    *----*----------*----------*-------*
    | 1  | true     | a.raw    | a.jpg |
    *----*----------*----------*-------*
    

    我不想要的。

    我应该改变我的设计,如果是,怎么做? 或者是否可以编写一个我想要的查询?

1 个答案:

答案 0 :(得分:0)

SELECT a.p_id id, a.p_complete complete, b.f_path negative, c.f_path copy FROM pictures a
left join files b on a.p_negative=b.f_id
left join files c on a.p_copy=c.f_id