UNION会覆盖以前的结果吗?`

时间:2014-10-08 10:08:55

标签: mysql

我在同一个表上有两个查询,我需要获得第一个结果集中没有出现的结果。

有几种方法可以到达那里(我没有要求),我的第一次尝试是这样的:

SELECT * FROM
(
    SELECT
        o.custom_order_id AS 'order',
        'yes'      AS 'test'
    FROM orders
    WHERE <first criteria>

    UNION

    SELECT
        o.custom_order_id AS 'order',
        'no'      AS 'test'
    FROM orders
    WHERE <second criteria>
) x
WHERE x.test = 'no'

UNION不会追加已出现在第一个结果集中的行。

实际上我确实得到像

这样的行
12345    no

12345确实出现在第一个结果集中(UNION之前的查询)。

为什么?

修改

custom_order_id没有索引而且不是主键(尽管它实际上是唯一的) - UNION是否需要(唯一)索引或pk将行识别为已经在 - 第一结果集

2 个答案:

答案 0 :(得分:1)

UNION使用整个元组来确定行是否唯一。在您的情况下(订单,测试)。

由于你的答案的一半已经将测试设置为“是”,并且一个“否”,你可以得到具有相同id的多个订单(一个用于是,一个用于否)。

答案 1 :(得分:0)

您只能获得带有&#34; no&#34;的行,因为这是您在最后WHERE子句中指定的内容:

WHERE x.test = 'no'

删除该内容,UNION将从联合查询中返回唯一行

UNION并不需要密钥,但优化查询几乎总是一个好主意:)尝试运行EXPLAIN ( above query with UNION goes here)并查看生成的内容。