4

我有两张桌子。

假设表 p 和表 q。这是我所做的:

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

假设结果集是这样的:

p.field q.field ....
   5 5 ...
   6 6 ...
   12 12 ..
   55 55 ....
   3 3 ...

现在我想选择这些行并使用单个查询:

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

结果集:

p.字段 ....
   44 ...
   93 ...
   13 ..
   8 ....
   55 ...

我不想使用union或子查询。

但是,我想在以下(示例)结果集中合并/合并这些行:

p.field q.field ....
   5 5 ...
   6 6 ...
   12 12 ..
   55 55 ....
   44 空...
   93 空...
   13 空..
   8 无效 ....

我必须将两个结果集加入到第三个表中,并按第三个表中的字段排序(如果确实重要的话)。

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 回答