我有两张桌子。
让我们说表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.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 null ....
我必须将两个结果集连接到第三个表并按第三个表中的字段排序(如果它确实重要)。
答案 0 :(得分: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) |
答案 1 :(得分:2)
如果我理解正确,您希望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'
答案 2 :(得分:1)
我不确定这是否有效但是试试这个。
SELECT p.*, q.* FROM p, q WHERE (p.field = q.field AND q.col = 'someValue') OR (q.sat = 'value')