没有Order By的SQL查询

时间:2015-08-06 10:15:42

标签: sql sql-server sql-server-2008-r2

SELECT ItemID, Name
FROM tblItem
WHERE ItemID IN (4, 38, 39, 37, 16, 8, 15,14)

通过使用上面给出的SQL查询,我得到的结果集是由ItemID按顺序排列的。

我希望结果集没有Order By或任何排序效果。

4   Item1
8   Item2
14  Item3
15  Item4
16  Item5
37  Item6
38  Item7 
39  Item8

5 个答案:

答案 0 :(得分:2)

要按特定顺序获取项目,您必须按这种方式对其进行排序。以特定顺序指定in语句中的值不会使数据库按此顺序获取它们。 in语句中的值将以某种方式处理,例如排序或放入哈希集,以便它们可以与索引匹配或在表扫描中使用。保持原始顺序的项目只会使查询变慢。

您可以使用case将身份转换为排序:

select
  ItemID, Name
from
  tblItem
where
  ItemID in (4, 38, 39, 37, 16, 8, 15,14)
order by
  case ItemID
    when 4 then 1
    when 38 then 2
    when 39 then 3
    when 37 then 4
    when 16 then 5
    when 8 then 6
    when 15 then 7
    when 14 then 8
  end

答案 1 :(得分:1)

查询将只返回找到的项目。数据库将(可能是索引和数据库实现可能会影响这一点)从一开始就开始,并通过表格将它们与列表进行比较。如果它们与列表中的itemId之一匹配,则会将其添加到resultSet中。可能性是它们按顺序添加到数据库中(生成ItemIds),因此您将首先获得最低的数据。但你无法保证会出现这种情况。

答案 2 :(得分:1)

如果您想要in子句(或其他任何内容)指定的结果集,则需要执行order by

执行此操作的一种方法是使用VALUES子句和join

SELECT i.ItemID, i.Name
FROM tblItem iJOIN
     (VALUES(4, 1), (38, 2), (39, 3), (37, 4), (16, 5), (8, 6), (15, 7), (14, 8)
     ) ids(id, priority)
     ON i.ItemId = ids.id
ORDER BY ids.priority;

答案 3 :(得分:0)

试试这个:

With item_ids as
  (select item_id from tblitem 
    where item_id IN (4,8,9....))
 select * from item_ids
  where item_id <(select max(item_id) from item_ids) or   
        item_id=(select max(item_id) from item_ids);

答案 4 :(得分:0)

如果您没有指定订单,则订单是任意的。 考虑一个单独的表或公用表表达式,其中包括一个SortOrder。 另一个好处是JOIN语法允许您保持基于SET的操作,而CASE语句将强制您的查询逐行(RBAR)。比这更好的是将排序顺序和项目ID放在他们自己的表中,这样你就不必动态创建CTE。这是CTE版本:

;with SortOrder (ItemID,Sort)
as (
    select 4, 1
    union select 38,2
    union select 39,3
    union select 37,4
    union select 16,5
    union select 8,6
    union select 15,7
    union select 14,8
   )
select tblItem.ItemID
     , tblItem.Name
  from tblItem
  join SortOrder
    on SortOrder.ItemID = tblItem.ItemID
order by SortOrder.Sort