【问题标题】:Why using union, result of 2 queries is mixing in SQLite?为什么使用联合,两个查询的结果混合在 SQLite 中?
【发布时间】:2017-05-26 09:42:34
【问题描述】:

我想附加 2 个查询的结果。例如:

ResultOfQuery_1

ResultOfQuery_2

我的查询是:

SELECT Id FName,SortString  
     FROM CTable 
     WHERE '1' = DevId AND SortString glob '[A-Z]*'      
UNION 
SELECT FName,SortString 
     FROM CTable 
     WHERE '1' = DevId AND SortString NOT glob '[A-Z]*' ORDER BY FName DESC

作为此查询的输出,两个结果是混合的。我要一个接一个。

谁能帮我得到我想要的结果?

【问题讨论】:

    标签: mysql sql database sqlite


    【解决方案1】:

    在您的情况下,Order by 适用于整个查询。如果我们可以使用括号,它会像

    (
    SELECT Id FName,SortString  
         FROM CTable 
         WHERE '1' = DevId AND SortString glob '[A-Z]*'      
    UNION 
    SELECT FName,SortString 
         FROM CTable 
         WHERE '1' = DevId AND SortString NOT glob '[A-Z]*' 
    )
    ORDER BY FName DESC
    

    您可能会使用一些排序字段

    SELECT Id, FName,SortString, 1 as OrderStr
        FROM CTable 
        WHERE '1' = DevId AND SortString glob '[A-Z]*'      
    UNION 
    SELECT Id, FName,SortString, 2 as OrderStr
        FROM CTable 
        WHERE '1' = DevId AND SortString NOT glob '[A-Z]*' 
    ORDER BY OrderStr, FName DESC
    

    或者可能是子查询

    SELECT *
        FROM(
            SELECT Id, FName,SortString
            FROM CTable 
            WHERE '1' = DevId AND SortString glob '[A-Z]*'  
            ORDER BY FName DESC
            ) T1
    UNION 
    SELECT *
        FROM(
            SELECT Id, FName,SortString
            FROM CTable 
            WHERE '1' = DevId AND SortString NOT glob '[A-Z]*'  
            ORDER BY FName DESC
            ) T2
    

    【讨论】:

    • UNION 总是排序(有效去除重复);你需要使用 UNION ALL。
    【解决方案2】:

    然后在sortstring 列上使用JOIN 而不是UNION 之类的

    select xx.Id, xx.FName as xxFName,
    xx.SortString as xxSortString,
    xxx.fname, xxx.SortString
    from (
    SELECT Id FName,SortString  
         FROM CTable 
         WHERE '1' = DevId AND SortString glob '[A-Z]*'  ) xx
    join (
    SELECT FName,SortString 
         FROM CTable 
         WHERE '1' = DevId AND SortString NOT glob '[A-Z]*' ) xxx
    on xx.sortstring = xxx.sortstring
     ORDER BY xx.FName DESC;
    

    【讨论】:

      【解决方案3】:

      只需使用一个查询:

      SELECT Id FName,SortString  
      FROM CTable 
      WHERE 1 = DevId 
      ORDER BY (SortString glob '[A-Z]*') DESC, FNAME DESC ;
      

      如果DevId 是一个数字,则不要在比较周围使用单引号。我删除了单引号,假设它是一个数字。

      【讨论】:

      • 谢谢 :) 但我想附加 2 个单独的查询结果。
      • @srb_programming 。 . .这是完成您所要求的最简单的答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-25
      相关资源
      最近更新 更多