而使用“联盟独特的”构建子查询从维护记录的顺序

问题描述 投票:1回答:2

我想,以确保从子查询结果的顺序,而使用不同的联盟保存。请注意,“联盟独特的”需要在重复过滤,而这样做的工会。

例如:

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 sql-order-by union
2个回答
4
投票

从本质上讲,同时使用“联盟独特的”结构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的官方文档。


1
投票
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
© www.soinside.com 2019 - 2024. All rights reserved.