【问题标题】:Select only those rows that are in multiple result sets仅选择多个结果集中的那些行
【发布时间】:2020-02-09 21:06:00
【问题描述】:

我有多个 SELECT 语句,它们都返回相同的列,但可能返回不同的结果集。有没有办法在数据库级别选择 all 结果集中的所有行?

例如

|---------------------|------------------|---------|
|          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),但我想避免遍历所有结果集,因为它们可能非常庞大。

提前致谢!

【问题讨论】:

  • Paul 和 Thomas 都不在所有结果集中。保罗只在#1 和#2,托马斯只在#1 和#3。所以整个结果集应该是空的。还是我弄错了?
  • 对不起,我的错。我将“Thomas”更改为“Pascal”并修复了结果集以保持简单。 :)
  • 复杂?加入?选定的列和行不是来自同一个表吗?顺便说一下,您正在寻找的是标准 SQL 中的INTERSECT,但 MySQL 不支持它。
  • 这正是我想要的!很遗憾,MySQL 不支持这一点。 :(
  • 好的,期望完全相同的数据,但来自不同的表是有点罕见的。唯一能想到的这种情况是模仿原始表的历史表。也许您应该在这里显示您的真实查询以获得更好的帮助。好吧,也许只是接受其中一个答案,然后提出新的请求。

标签: mysql sql node.js select resultset


【解决方案1】:

有没有办法选择所有结果集中的所有行?

你似乎想要and

select name 
from table 
where age > 40 and name like 'P%' and id < 3

【讨论】:

  • 我编辑了我的问题以进一步澄清问题。这些语句可能会变得非常复杂,因此不可能或不需要“与”。
  • @ChristianRiese:您的样本数据不一致:Pascal 的 id 为 4,在 3 以上,所以第三次查询没有返回。 where 如何不能满足您的要求?它返回满足所有条件的记录,这似乎是你想要的。
  • @ChristianRiese 。 . .这回答了您在这里提出的问题。如果您的问题不能代表您实际遇到的问题,请提出一个新问题并提供一个更好的示例——这应该有助于您理解为什么您提供的示例可能不适合您的最终目的。
  • 哪里不是我问题的答案,因为选择的结果不一定来自同一个表。唯一的前提是,结果集看起来相同。也许我应该在我的问题中澄清这一点。
【解决方案2】:

如果无法在 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)

【讨论】:

    【解决方案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 的答案最为简洁。

    【讨论】:

      【解决方案4】:

      如果您的语句很复杂,您可以做的是使用一个过程,其中每个语句都将匹配的 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
      

      【讨论】:

        猜你喜欢
        • 2011-12-11
        • 1970-01-01
        • 2021-02-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-26
        • 1970-01-01
        相关资源
        最近更新 更多