90472


## 前提

2つのテーブルのうち片方にしか存在しないデータを抽出したい  
自身でも考えましたが、一向に進まないのでお力添えをお願いします。

## テーブル

テーブルA

company | image_file1 | image_file2 | image_file3  
---|---|---|---  
竹中不動産 | 000.jpg | 301.jpg | 002.jpg  
竹中不動産 | 050.jpg | 501.jpg | 032.jpg  
三葉不動産 | 110.jpg | 161.jpg | 112.jpg  
ベニエル不動産 | 220.jpg | 221.jpg | 222.jpg  
  
テーブルB

company | file_name  
---|---  
竹中不動産 | 000.jpg  
竹中不動産 | 301.jpg  
竹中不動産 | 002.jpg  
竹中不動産 | 050.jpg  
三葉不動産 | 110.jpg  
三葉不動産 | 112.jpg  
ベニエル不動産 | 220.jpg  
  
期待する結果

company | image_file1 | image_file2 | image_file3  
---|---|---|---  
竹中不動産 |  | 501.jpg | 032.jpg  
三葉不動産 |  | 161.jpg |  
ベニエル不動産 |  | 221.jpg | 222.jpg  
  
テーブルAは各レコードが１つの物件情報  
1つめの竹中不動産の場合  
竹中不動産が所有する物件で画像が3枚あることを表す

## 自分で考えたこと

[code]

    SELECT campany, image_file1, image_file2, image_file3
    FROM tableA
    LEFT OUTER JOIN table b
    ON
    
[/code]

までは考えたのですが、この後が続きません  
そもそも上記の途中までのクエリ自体まちがっているかも・・・


CC BY-SA 4.0
2022-08-09T16:08:20.180
90460
2022-08-10T01:41:55.630
51745
question
sql postgresql sqlite
SQL 片方のテーブルにのみ存在するデータを抽出したい


テーブルBに`file_name`が存在しない項目のみ`image_fileX`を表示する目的ならば、下記のSQLで実現可能です。

[code]

    select *
    from   (select A.company
                  ,nullif(A.image_file1, B1.file_name) as image_file1
                  ,nullif(A.image_file2, B2.file_name) as image_file2
                  ,nullif(A.image_file3, B3.file_name) as image_file3
            from   A
            left outer join B as B1 on B1.company = A.company and B1.file_name = A.image_file1
            left outer join B as B2 on B2.company = A.company and B2.file_name = A.image_file2
            left outer join B as B3 on B3.company = A.company and B3.file_name = A.image_file3
           ) T
    where coalesce(image_file1, image_file2, image_file3) is not null
    
[/code]

テーブルAの`image_fileX`とテーブルBの`file_name`をそれぞれ左外部結合して、両カラムが存在する場合は`nullif`関数で`null`にしています。

`nullif`関数は[PostgreSQL](https://postgresweb.com/how-to-use-the-nullif-
function)にも[SQLite](https://www.javadrive.jp/sqlite/function/index25.html)にも存在するので、どちらのデータベースでも同じ結果が返ります。

**実行結果**

company | image_file1 | image_file2 | image_file3  
---|---|---|---  
竹中不動産 |  | 501.jpg | 032.jpg  
三葉不動産 |  | 161.jpg |  
ベニエル不動産 |  | 221.jpg | 222.jpg  
  
* * *

[View on DB Fiddle](https://www.db-fiddle.com/f/oAYMn3M8UBLsiDPYDXppUd/1)


CC BY-SA 4.0
2022-08-10T00:28:51.313
90472
2022-08-10T01:41:55.630
2022-08-10T01:41:55.630
9820
9820
90460
answer