【问题标题】:Custom Result Order using UNION - TSQL使用 UNION - SQL 的自定义结果顺序
【发布时间】:2011-02-11 14:09:20
【问题描述】:

我有一个相当简单的任务,我需要先选择具有值为 1 的特定字段的行,然后选择值为 2 的行,最后选择值为 0 的所有其他行。

我使用连接来获取哪些项目属于哪个类别。我认为执行 3 次选择并使用联合会组合到正确的顺序,但我错了 :)

我的SQL如下:

SELECT * FROM tblcompanycategory 
INNER JOIN tblcompany
ON tblcompany.idcompany = tblcompanycategory.idcompany
WHERE tblcompanycategory.idcategory = @category AND tblcompany.intpremium = 1 
UNION 
SELECT * FROM tblcompanycategory 
INNER JOIN tblcompany
ON tblcompany.idcompany = tblcompanycategory.idcompany
WHERE tblcompanycategory.idcategory = @category AND tblcompany.intpremium = 2
UNION 
SELECT * FROM tblcompanycategory 
INNER JOIN tblcompany
ON tblcompany.idcompany = tblcompanycategory.idcompany
WHERE tblcompanycategory.idcategory = @category AND tblcompany.intpremium = 0

我的结果没有按 1、2 和 0 排序。我在这里做错了什么??

* 解决方案 * 谢谢你们的帮助。下面是我使用的最终 SQL。

SELECT * FROM tblcompanycategory 
    INNER JOIN tblcompany
    ON tblcompany.idcompany = tblcompanycategory.idcompany
    WHERE tblcompanycategory.idcategory = @category 
    ORDER BY CASE tblcompany.intpremium WHEN 1 THEN 0 WHEN 2 THEN 1 WHEN 0 THEN 2 END

【问题讨论】:

    标签: sql sql-server database tsql


    【解决方案1】:

    与所有好的集合运算符一样,UNION 语句在对数据排序时是不可知的。

    但是,您可以做的是使用精心设计的 ORDER BY 语句运行一个 select 语句,例如:

    ... ORDER BY CASE tblCompany.IntPremium WHEN 1 THEN 0 WHEN 2 THEN 1 WHEN 0 THEN 2 END
    

    【讨论】:

      【解决方案2】:

      排序不会按照您在联合子句中的选择语句的顺序发生。最简单的做法是通过以下方式添加订单:

      SELECT * FROM tblcompanycategory 
      INNER JOIN tblcompany
      ON tblcompany.idcompany = tblcompanycategory.idcompany
      WHERE tblcompanycategory.idcategory = @category AND tblcompany.intpremium = 1 
      UNION 
      SELECT * FROM tblcompanycategory 
      INNER JOIN tblcompany
      ON tblcompany.idcompany = tblcompanycategory.idcompany
      WHERE tblcompanycategory.idcategory = @category AND tblcompany.intpremium = 2
      UNION 
      SELECT * FROM tblcompanycategory 
      INNER JOIN tblcompany
      ON tblcompany.idcompany = tblcompanycategory.idcompany
      WHERE tblcompanycategory.idcategory = @category AND tblcompany.intpremium = 0
      
      ORDER BY CASE intpremium WHEN 1 THEN 1 WHEN 2 THEN 2 WHEN 0 THEN 3 END
      

      【讨论】:

        【解决方案3】:

        您需要在三个 select 语句中添加一个列,其中包含一个对结果“分类”的字面值。然后按该列排序。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-01-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多