19

我需要合并两个查询结果,但我只想保留两个结果之间的差异。这可能吗?

我基本上是在查询 1 中选择所有资源,在查询 2 中选择 NOT-ALLOWED 资源,我显然需要在最后一个结果中使用 ALLOWED 资源。

在伪代码中:

Query1 - Query2

查询结果1:

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

查询结果 2:

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

需要:

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

4 回答 4

55

像这样,使用NOT IN

SELECT id FROM queryOneTable
WHERE id NOT IN (
    SELECT id FROM queryTwoTable
)
于 2009-10-15T02:22:00.467 回答
4

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

select x.id
from x 
left join y on x.id = y.id
where y.id is null
于 2009-10-15T03:05:32.917 回答
1

左连接方法更加通用,因为您可以在两个表(或任何两个查询结果集)上使用它,其中唯一性不是由一个id 组成,而是由几个列值的组合组成。此外,掌握外连接(sa left)被认为是更好的 SQL(或至少以前是这样),因为它比编写嵌套选择的性能更高。

于 2015-09-10T15:11:10.277 回答
1

在 10.3 版本中将有EXCEPT命令。MariaDB

同时,如果您需要完全不同,而不仅仅是在一个领域,您可以使用CONCAT变通方法。这个想法是连接您的第一个查询的所有字段并添加

HAVING CONCAT_WS(',', field_names) NOT IN (
  SELECT CONCAT(',', fields) FROM other_query
)

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

于 2018-03-27T11:47:29.487 回答