我有多个SELECT
语句,它们都返回相同的列,但可能返回不同的结果集。有没有办法在数据库级别选择所有结果集中的所有行?
例如
|---------------------|------------------|---------|
| ID | Name | Age |
|---------------------|------------------|---------|
| 1 | Paul | 50 |
| 2 | Peter | 40 |
| 3 | Frank | 20 |
| 4 | Pascal | 60 |
|---------------------|------------------|---------|
SELECT 1
SELECT name FROM table WHERE age > 40
Result: Paul, Pascal
SELECT 2
SELECT name FROM table where name like 'P%'
Result: Paul, Peter, Pascal
SELECT 3
SELECT name FROM table where id > 3
Result: Pascal
编辑:这是我问题的一个非常简单的例子。语句可能会变得非常复杂(联接在多个表上(,因此WHERE
部分中的简单AND
不是最终解决方案。
结果应该是Pascal
.我正在寻找的是类似于"反向UNION
"的东西。
或者,可以通过编程方式(NodeJS(实现这一点,但我想避免遍历所有结果集,因为它们可能非常大。
提前感谢!
有没有办法选择所有结果集中的所有行?
你似乎想要and
:
select name
from table
where age > 40 and name like 'P%' and id < 3
如果无法在WHERE
条件之间使用AND
,则可以使用初始查询对子查询使用多个IN
表达式。
SELECT name
FROM table
WHERE id IN (SELECT id FROM table WHERE age > 40)
AND id IN (SELECT id FROM table where name like 'P%')
AND id IN (SELECT id FROM table where id < 3)
如果您有不同的结果集,并且想要查看交集,则可以使用join
:
select q1.id
from (<query 1>) q1 join
(<query 2>) q2
on q1.id = q2.id join
(<query 3>) q3
on q1.id = q3.id;
也就是说,我认为GMB对你实际提出的问题有最简洁的答案。
如果您的语句很复杂,您可以做的是使用一个过程,其中每个语句将匹配的 id 放入临时表中。然后选择 id 与语句数匹配的行。这也很可能比将所有复杂语句合并为一个大型查询更有效。
create procedure sp_match_all()
begin
drop temporary table if exists match_tmp;
create temporary table match_tmp (
id int
);
insert into match_tmp
SELECT id FROM table WHERE age > 40;
insert into match_tmp
SELECT id FROM table where name like 'P%';
insert into match_tmp
SELECT id FROM table where id < 3;
select t.name
from table t
join (
select id
from match_tmp
group by id
having count(*)=3
) q on q.id=t.id;
drop temporary table match_tmp;
end