UNION是否覆盖以前的结果?'
我在同一张表上有两个查询,我需要得到的结果没有出现在第一个结果集中。UNION是否覆盖以前的结果?'
有几种方法可以到那里(我不问了一个),我第一次尝试是这样的:
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
行,但(UNION
前查询)12345
会出现在第一个结果集。
为什么?
编辑:
custom_order_id
没有索引,而不是主键(虽然它实际上是唯一的) - 不UNION
需要一个(唯一)的索引或峰承认,连续被评为已经在一-resultset?
UNION
使用整个元组来确定一行是否唯一。你的情况是(订单,测试)。
由于你答案的一半有测试设置为“是”,一个“不”,最终可能会得到多个具有相同ID的订单(一个用于是,一个用于否)。
我很专注于订单ID,我完全没有看到我的测试旗法律:-)谢谢你和阿德里亚诺。 – DanFromGermany 2014-10-08 10:29:11
你只能用“没有”得行,因为你在WHERE
条款在最后规定那是什么:
WHERE x.test = 'no'
删掉和UNION
将返回从被联合查询唯一行。
UNION
不需要密钥,虽然优化查询几乎总是一个好主意:)尝试运行EXPLAIN (above query with UNION goes here)
并查看生成的内容。
不是我downvoting(我一般不downvote在我自己的问题上的答案),但我认为这是因为在哪里不是问题在这里:-) – DanFromGermany 2014-10-08 10:20:42
所以我只是误解了这个问题。谢谢。 – Kleskowy 2014-10-08 14:15:18
'UNION'将返回唯一的**行**。 “12345是”和“12345否”是**两个唯一行**。在你的例子中,如果你删除'test'字段,你会得到你想要的。 – 2014-10-08 10:12:22
@AdrianoRepetti这正是我的错误。 – DanFromGermany 2014-10-08 10:16:35
有人能告诉我我的答案有什么问题吗? downvote困惑了我的废话:) – Kleskowy 2014-10-08 10:19:33