仅选择位于多个结果集中的那些行



我有多个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

相关内容

  • 没有找到相关文章

最新更新