繁体   English   中英

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

[英]Select only those rows that are in multiple result sets

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM