32365
[テーブル：Person]  
name  
－－－  
Sato  
Suzuki  
Takahashi

みたいなテーブルがあったとして、ここから異なる条件にマッチするフィールドを横に並べて表示するために、CROSS JOINするとします。

SELECT A.name B.name  
FROM ( SELECT name FROM Person WHERE name = 'Sato' ) A,  
( SELECT name FROM Person WHERE name = 'Takahashi' ) B;

[結果]  
name | name  
Sato | Takahashi

このときサブクエリで行が返ってくればいいのですが、WHERE句で引っかからない場合はCROSS JOINで何も返ってこなくなります。

SELECT A.name B.name  
FROM ( SELECT name FROM Person WHERE name = 'Hoge' ) A,  
( SELECT name FROM Person WHERE name = 'Takahashi' ) B;

[結果]  
name | name

こちらが望む結果としては↑のような場合に  
[結果]  
name | name  
null | Takahashi  
となって欲しいのですが、なにかいい方法ありませんでしょうか？  
よろしくお願いします。
CC BY-SA 3.0
2017-02-03T09:39:40.200
32364
2017-02-06T02:04:49.050
2017-02-03T09:52:24.180
18547
18547
question
sql
条件によっては行を返さないサブクエリをCROSS JOINしたい
完全外部結合やSELECT句の副問い合わせで実現できますが…。  
ロジックを見直して、別々のSQLで取得するのが「いい方法」のように思います。

Oracleでの完全外部結合の例:

```

    with Person as
    (select 'Suzuki' name from dual union all
     select 'Sato' name from dual union all
     select 'Takahashi' name from dual)
    
    SELECT A.name, B.name
    FROM ( SELECT name FROM Person WHERE name = 'Hoge' ) A FULL OUTER JOIN
    ( SELECT name FROM Person WHERE name = 'Takahashi' ) B ON 1 = 1
    
```

OracleでのSELECT句の副問い合わせの例:

```

    with Person as
    (select 'Suzuki' name from dual union all
     select 'Sato' name from dual union all
     select 'Takahashi' name from dual)
    
    SELECT (SELECT name FROM Person WHERE name = 'Hoge'),
           (SELECT name FROM Person WHERE name = 'Takahashi')
    FROM   dual
    
```
CC BY-SA 3.0
2017-02-03T10:16:37.900
32365
2017-02-06T02:04:49.050
2017-02-06T02:04:49.050
2238
9820
32364
answer