我在同一个表上有两个查询,我需要获得第一个结果集中没有出现的结果。
有几种方法可以到达那里(我没有要求),我的第一次尝试是这样的:
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将行识别为已经在 - 第一结果集
答案 0 :(得分:1)
UNION
使用整个元组来确定行是否唯一。在您的情况下(订单,测试)。
由于你的答案的一半已经将测试设置为“是”,并且一个“否”,你可以得到具有相同id的多个订单(一个用于是,一个用于否)。
答案 1 :(得分:0)
您只能获得带有&#34; no&#34;的行,因为这是您在最后WHERE
子句中指定的内容:
WHERE x.test = 'no'
删除该内容,UNION
将从联合查询中返回唯一行。
UNION
并不需要密钥,但优化查询几乎总是一个好主意:)尝试运行EXPLAIN ( above query with UNION goes here)
并查看生成的内容。