4

2つのテーブルがあります。

テーブルpとテーブルqを考えてみましょう。これが私がすることです:

select p.*, q.* 
from p inner join q on p.field = q.field 
where q.col = 'someValue';

結果セットが次のようなものであるとします。

p.fieldq.field...。
   55..。
   66..。
   1212.。
   5555...。
   33..。

次に、これらの行と単一のクエリを使用する行を選択します。

select p.*  
from p where p.sat = 'value'

結果セット:

p.field...。
   44..。
   93..。
   13.。
   8...。
   55..。

使用したくない、unionまたはサブクエリを実行したくない。

ただし、次の(例)結果セットでこれらの行を結合/マージしたいと思います。

p.fieldq.field...。
   55..。
   66..。
   1212.。
   5555...。
   44null..。
   93null..。
   13null.。
   8null...。

2つの結果セットを3番目のテーブルに結合し、3番目のテーブルのフィールドで並べ替える必要があります(重要な場合)。

4

3 に答える 3

3

あなたはこれを行うことができます:

SELECT
  p1.*, 
  q.* ,
  p2.* -- Note that you might need to change the columns' names 
       -- with different aliases than those selected from p1.*
FROM p       AS p1
INNER JOIN q        ON p.field = q.field 
INNER JOIN p AS p2  ON p.field = p2.field 
                   AND p2.sat = 'value'
WHERE q.col = 'someValue'
-- ORDER BY ...;

私はあなたがUNIONそのようにこれのために使わなければならないと思います:

SELECT
  p.field field1,
  q.field field2
FROM p
INNER JOIN q  ON p.field = q.field
UNION ALL
SELECT p.field, NULL
FROM p
WHERE sat = 'value';

これはあなたに与えるでしょう:

| FIELD1 | FIELD2 |
-------------------
|      5 |      5 |
|      6 |      6 |
|     12 |     12 |
|     55 |     55 |
|      3 |      3 |
|     55 |     55 |
|     44 | (null) |
|     93 | (null) |
|     13 | (null) |
|      8 | (null) |
|     55 | (null) |

SQLフィドルデモ

于 2013-03-02T18:39:06.113 に答える
3

私が正しく理解していればp.sat = 'value'、qの結合と条件を満たすすべての行と同様にすべての行が必要です。これは、次のように最も簡単に表現されますleft outer join

select p.*, q.* 
from p left outer join
     q
     on p.field = q.field 
where p.sat = 'value' or q.col = 'someValue'
于 2013-03-02T18:53:08.660 に答える
1

これが機能するかどうかはわかりませんが、試してみてください。

SELECT p.*, q.* FROM p, q WHERE (p.field = q.field AND q.col = 'someValue') OR (q.sat = 'value')

于 2013-03-02T18:41:39.573 に答える