2014-10-08 201 views
0

我在同一张表上有两个查询,我需要得到的结果没有出现在第一个结果集中。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

+2

'UNION'将返回唯一的**行**。 “12345是”和“12345否”是**两个唯一行**。在你的例子中,如果你删除'test'字段,你会得到你想要的。 – 2014-10-08 10:12:22

+1

@AdrianoRepetti这正是我的错误。 – DanFromGermany 2014-10-08 10:16:35

+0

有人能告诉我我的答案有什么问题吗? downvote困惑了我的废话:) – Kleskowy 2014-10-08 10:19:33

回答

1

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

由于你答案的一半有测试设置为“是”,一个“不”,最终可能会得到多个具有相同ID的订单(一个用于是,一个用于否)。

+0

我很专注于订单ID,我完全没有看到我的测试旗法律:-)谢谢你和阿德里亚诺。 – DanFromGermany 2014-10-08 10:29:11

0

你只能用“没有”得行,因为你在WHERE条款在最后规定那是什么:

WHERE x.test = 'no' 

删掉和UNION将返回从被联合查询唯一行

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

+1

不是我downvoting(我一般不downvote在我自己的问题上的答案),但我认为这是因为在哪里不是问题在这里:-) – DanFromGermany 2014-10-08 10:20:42

+0

所以我只是误解了这个问题。谢谢。 – Kleskowy 2014-10-08 14:15:18