我有两个表。
假设表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'
resultset:
<>之前p.field……44……93年 ...13 . .8 ....55……之前我不想使用union
或子查询。
但是,我想在以下(示例)结果集中统一/合并这些行:
<>之前P.field . q.field ....5 5……6 6……12 12…55 55 ....44 null…93 null…13 null ..8空....之前我必须将两个结果集连接到第三个表,并按第三个表中的字段排序(如果重要的话)。
你可以这样做:
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 Fiddle Demo
如果我理解正确,您希望所有行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'
我不确定这是否会起作用,但试试这个
SELECT p.*, q.* FROM p, q WHERE (p.field = q.field AND q.col = 'someValue') OR (q.sat = 'value')