我想,以确保从子查询结果的顺序,而使用不同的联盟保存。请注意,“联盟独特的”需要在重复过滤,而这样做的工会。
例如:
select columnA1, columnA2 from tableA order by [columnA3] asc
union distinct
select columnB1, columnB2 from tableB
当我运行此,我期待从子查询订购的记录(选择columnA1
,从columnA2
ASC tableA
排序[columnA3]
)谁先其次是来自columnA3
(由tableB
ASC返回的顺序排列)。
我假设我不能添加其他虚拟列,因为这将使工会独特到不行。所以,这是不行的:
select column1, column2 from
( select column1, column2, 1 as ORD from tableA order by [columnA3] asc
union distinct
select column1, column2, 2 as ORD from tableB
) order by ORD
从本质上讲,同时使用“联盟独特的”结构MySQL是不保留的从子查询记录的顺序。一些研究之后,我发现,它的工作原理,如果我们把一个限制条款或有嵌套查询。所以,下面是两种方法:
方法1:使用限制条款
select columnA1, columnA2 from tableA order by [columnA3] asc Limit 100000000
union distinct
select columnB1, columnB2 from tableB
我一直在使用几个数据集测试这种行为,它似乎工作始终。此外,还有MySQL的文档(http://dev.mysql.com/doc/refman/5.1/en/union.html)在此行为的引用:“使用ORDER BY的个人SELECT语句暗示有关订单没有在该行出现在最终的结果,因为UNION默认情况下会产生一组无序的行。因此,在此背景下使用的ORDER BY通常与LIMIT结合,使得它被用于确定所选择的行的子集,以检索用于SELECT,即使它并不一定会影响在这些行的顺序最终联合的结果。如果ORDER BY没有出现在SELECT LIMIT,它优化掉,因为它不会有任何效果反正“。
请注意,在选择百亿其他的限制高于具有足够高的数量,以确保我们涵盖所有情况下没有特别的理由。
方法2:像一个下面也适用嵌套查询。
select column1, column2 from
( select column1, column2 order by [columnA3] asc ) alias1
union distinct
( select column1, column2 from tableB )
我无法找到嵌套查询工作的理由。有在网上被一些参考(如一个从菲尔麦卡利在http://dev.mysql.com/doc/refman/5.0/en/union.html),但是从MySQL的官方文档。
select column1, column2 from
( select column1, column2, 1 as ORD from tableA
union distinct
select tableB.column1, tableB.column2, 2 as ORD from tableB
LEFT JOIN tableA
ON tableA.column1 = tableB.column1 AND tableA.column2 = tableB.column2
WHERE tableA.column1 IS NULL
) order by ORD
注意整个组独立,是工会不仅去愚弄,但台内
或者:
select column1, column2 from
( select column1, column2, 1 as ORD from tableA
union distinct
select column1, column2, 2 as ORD from tableB
WHERE (column1, column2) NOT IN (SELECT column1, column2 from tableA)
) order by ORD