MySQL - 是否有可能获取两个查询结果的“差异”?

21
我需要合并两个查询结果,类似于union的操作,但我只想保留两个结果之间的差异。这可能吗?
基本上我在Query 1中选择了所有资源,在Query 2中选择了不允许的资源,显然我在最终结果中需要允许的资源。
伪代码如下:
Query1 - Query2

查询结果1:

+-------+
|  id   |
+-------+
|   1   |
+-------+
|   2   |
+-------+
|   3   |
+-------+
|   4   |
+-------+
|   5   |
+-------+
|   6   |
+-------+

查询结果2:

+-------+
|  id   |
+-------+
|   2   |
+-------+
|   5   |
+-------+

需要:

+-------+
|  id   |
+-------+
|   1   |
+-------+
|   3   |
+-------+
|   4   |
+-------+
|   6   |
+-------+

需求不明确。文本说明提到要获取query1的全部内容,但示例与此相矛盾。让我们尝试仅通过示例来定义需求。如果query2有7或0,这些值是否会包含在差异中? - mjv
1
我同意标题与问题主体不符,但问题本身非常清晰。OP要求减法:所有不是“不可用”的资源:A - B - nickf
一开始我还以为他在要求将查询1的字段值减去查询2的字段值。 - putolaruan
抱歉表述不清,但是ALL RESOURCES指的是从RESOURCE表中获取的所有记录都包含在QUERY1中。因此,如果7不在QUERY1中,它就永远不会出现在QUERY2中。 - Ropstah
4个回答

58

像这样,使用NOT IN

SELECT id FROM queryOneTable
WHERE id NOT IN (
    SELECT id FROM queryTwoTable
)

在MySQL 8.0中,您可以使用“WITH”公共表达式来定义queryOneTable和queryTwoTable,以防每个子查询都很复杂。 - ColinM

4

我在 SQLExpress 中测试了此查询,因为我没有 MySql。 我假设它的工作方式相同。

select x.id
from x 
left join y on x.id = y.id
where y.id is null

2
在MariaDB 10.3版本中,将不再支持EXCEPT命令。
同时,如果您需要完整的差异而不仅是一个字段,可以使用CONCAT解决方法。其思路是将第一个查询的所有字段连接起来并添加。
HAVING CONCAT_WS(',', field_names) NOT IN (
  SELECT CONCAT(',', fields) FROM other_query
)

如果字段的值可能包含逗号,请选择另一个分隔符。此外,对于可能包含空值的字段,请添加IFNULL检查。

1
左连接方法更加灵活,因为您可以将其用于两个表(或任何两个查询结果集),其中唯一性不仅由一个id组成,而是由几个列值的组合组成。此外,它被认为是更好的SQL(或者至少曾经是这样),因为掌握外部连接(如左连接)比编写嵌套选择更具性能优势。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接